Delphi Can

Orjinalini görmek için tıklayınız: ( Kapandı ) Sql sorgu da string alana göre sıralama
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
İyi günler.

Veri tabanında S_Siparis_no nvarchar(15)  alanı verilen sipariş sayısına göre artıyor.

S_GrupToplam nvarchar(20)  alanı ise verilen sipariş 1 adet ise 0  sipariş 1den fazla ise örneği 6 adet   10 .. 15  gibi bilgi yazılıyor.

Kullandığım sorgu aşağıda grup by kullandığım için  S_Siparis_no alanının  order by kullanamıyorum.

S_GrupToplam  alanı string olduğu için sıralama hatalı geliyor bu konuda tecrübesi olan çözümü paylaşabilir mi?

select CASE WHEN S_GrupToplam = ' ' THEN S_SIPARIS_NO ELSE S_GrupToplam END As Gecici_sip_no,S_KAPI_MODEL,S_BAYI_KODU, S_BAYI_ADI,S_OZ_KOD, S_KAPI_EN,S_MOB_KANAT_EN_DUS,S_KAPI_BOY,S_MOB_KANAT_BOY_DUS,
S_YAVRU_MOB_EN_DUS,S_YAVRU_KANAT_BOY_HES,s_dismodelresim,S_SIP_TRH, S_IMODEL, S_DMODEL, S_Bolme_TUR,S_YAVRU_KANAT_EN_HES,S_USTBOLME_ACK, 
S_IRENK, S_DRENK,S_Ahsap_Not,S_AHSAP_BOY, S_CHK_CIFTKANAT,S_GITTI,S_NOT3, S_KAPI_TUR,S_KASAEXTRA,S_bolme_tur,S_Grup_kod,S_KANATTUR_ID, 
KANATTUR.Kanat_Id,KANATTUR.kanat_turu, SUM(CASE WHEN S_YON =  'SAG' THEN 1  END) AS say_Sag,SUM(CASE WHEN S_YON = 'SOL' THEN 1 END) AS say_Sol 

from Siparis LEFT JOIN KANATTUR ON  S_KANATTUR_ID = KANATTUR.Kanat_Id WHERE  S_BAYI_ADI ='HAYDAR SULTANY' and S_Mobilyasiz<>1 and S_GITTI<>1 AND 
S_IMALAT_NO>=1 AND S_IMALAT_NO<=999999 AND S_SIPARIS_NO>=1 AND S_SIPARIS_NO<=999999 AND CONVERT(date,S_SIP_TRH,104) >= CONVERT(date,'01.08.2024',104)  AND 
CONVERT(date,S_SIP_TRH,104) <= CONVERT(date,'19.08.2024',104)  

group by S_KANATTUR_ID,S_KAPI_MODEL,S_BAYI_KODU, S_BAYI_ADI,S_OZ_KOD, S_Grup_kod,s_dismodelresim,S_KAPI_EN,S_MOB_KANAT_EN_DUS,
S_KAPI_BOY,S_MOB_KANAT_BOY_DUS,S_YAVRU_MOB_EN_DUS,S_YAVRU_KANAT_BOY_HES, S_SIP_TRH, S_IMODEL, S_DMODEL, S_Bolme_TUR,S_YAVRU_KANAT_EN_HES,
S_USTBOLME_ACK,KANATTUR.Kanat_Id,KANATTUR.kanat_turu, S_IRENK, S_DRENK,S_Ahsap_Not,S_AHSAP_BOY, S_CHK_CIFTKANAT,S_GITTI,S_NOT3, 
S_KAPI_TUR,S_KASAEXTRA,S_bolme_tur, CASE WHEN S_GrupToplam = ' ' THEN S_SIPARIS_NO ELSE S_GrupToplam END order by Gecici_sip_no ASC

bu sorgu sonunda çıkan sonuç resmi
select de sipariş no yu cast ile integer a çevirip denediniz mi;?
Sipariş numarasını 8-10 hane yap. Numarayı da buna göre verirsen bir sıkıntı olmaz.

00000001
00000005
00001001
00001001

UPDATE TABLO set sip_no=RIGHT('00000000'+sip_no,8)

Fiş numarasını gönderdiğinde son karakteri bir arttırır; 

function TDBF.SONNUMARA(FISNO:String):String;
var
SN : string;
S1 : Char;
I1 : Integer;
begin
SN:= FISNO;
if Length(SN)<=0 then begin Result:='1'; exit; end;
try
I1:=Length(SN);
while I1>=0 do
begin
S1:=SN[I1];
 case S1 of
 '0'..'8','A'..'Y','a'..'y':
     begin
     SN[I1]:= Chr(Ord(S1)+1);
     I1:=0;
     end;
 '9' : begin SN[I1]:= #48; if I1=1 then SN:='1'+SN; end;
 'Z' : begin SN[I1]:= #65; if I1=1 then SN:='A'+SN; end;
 'z' : begin SN[I1]:= #97; if I1=1 then SN:='a'+SN; end;
 end;
inc(I1,-1);
end;
Result:=SN;
except
Result:='1';
end;
end;f
(30-08-2024, Saat: 17:41)mcuyan Adlı Kullanıcıdan Alıntı: [ -> ]select de sipariş no yu cast ile integer a çevirip denediniz mi;?

Cevap için teşekkür ederim ama grup by olduğundan order by da sipariş no kullanamıyorum bilmediğim bir yolu varsa öğrenmek isterim cast ile integer yapsanız bile order by da sipariş no hata veriyor

(30-08-2024, Saat: 17:45)m_ekici Adlı Kullanıcıdan Alıntı: [ -> ]Sipariş numarasını 8-10 hane yap. Numarayı da buna göre verirsen bir sıkıntı olmaz.  

00000001
00000005
00001001
00001001

UPDATE TABLO set sip_no=RIGHT('00000000'+sip_no,8)

Fiş numarasını gönderdiğinde son karakteri bir arttırır; 

function TDBF.SONNUMARA(FISNO:String):String;
var
SN : string;
S1 : Char;
I1 : Integer;
begin
SN:= FISNO;
if Length(SN)<=0 then begin Result:='1'; exit; end;
try
I1:=Length(SN);
while I1>=0 do
begin
S1:=SN[I1];
 case S1 of
 '0'..'8','A'..'Y','a'..'y':
     begin
     SN[I1]:= Chr(Ord(S1)+1);
     I1:=0;
     end;
 '9' : begin SN[I1]:= #48; if I1=1 then SN:='1'+SN; end;
 'Z' : begin SN[I1]:= #65; if I1=1 then SN:='A'+SN; end;
 'z' : begin SN[I1]:= #97; if I1=1 then SN:='a'+SN; end;
 end;
inc(I1,-1);
end;
Result:=SN;
except
Result:='1';
end;
end;f

İzah edemedi isem kusura bakmayım yukardaki açıklama olduğu gibi sipariş no alanını kullanamıyorum
Şöyle bir yöntem deneyebilirsiniz. Yaptığınız sorguyu içeren / kapsayan bir select daha ekleyerek, içerideki sorgudan dönen veriler üzerinde çeşitli işlemler (order by gibi) yapabilirsiniz.

SELECT * FROM (
SELECT * FROM Products
ORDER BY Price) as x
order by x.SupplierID

Sizin sql sorgunuz şunun gibi olacak.

Select * From (
select CASE WHEN S_GrupToplam = ' ' THEN S_SIPARIS_NO ELSE S_GrupToplam END As Gecici_sip_no,S_KAPI_MODEL,S_BAYI_KODU, S_BAYI_ADI,S_OZ_KOD, S_KAPI_EN,S_MOB_KANAT_EN_DUS,S_KAPI_BOY,S_MOB_KANAT_BOY_DUS,
S_YAVRU_MOB_EN_DUS,S_YAVRU_KANAT_BOY_HES,s_dismodelresim,S_SIP_TRH, S_IMODEL, S_DMODEL, S_Bolme_TUR,S_YAVRU_KANAT_EN_HES,S_USTBOLME_ACK, 
S_IRENK, S_DRENK,S_Ahsap_Not,S_AHSAP_BOY, S_CHK_CIFTKANAT,S_GITTI,S_NOT3, S_KAPI_TUR,S_KASAEXTRA,S_bolme_tur,S_Grup_kod,S_KANATTUR_ID, 
KANATTUR.Kanat_Id,KANATTUR.kanat_turu, SUM(CASE WHEN S_YON =  'SAG' THEN 1  END) AS say_Sag,SUM(CASE WHEN S_YON = 'SOL' THEN 1 END) AS say_Sol 

from Siparis LEFT JOIN KANATTUR ON  S_KANATTUR_ID = KANATTUR.Kanat_Id WHERE  S_BAYI_ADI ='HAYDAR SULTANY' and S_Mobilyasiz<>1 and S_GITTI<>1 AND
S_IMALAT_NO>=1 AND S_IMALAT_NO<=999999 AND S_SIPARIS_NO>=1 AND S_SIPARIS_NO<=999999 AND CONVERT(date,S_SIP_TRH,104) >= CONVERT(date,'01.08.2024',104)  AND
CONVERT(date,S_SIP_TRH,104) <= CONVERT(date,'19.08.2024',104)  

group by S_KANATTUR_ID,S_KAPI_MODEL,S_BAYI_KODU, S_BAYI_ADI,S_OZ_KOD, S_Grup_kod,s_dismodelresim,S_KAPI_EN,S_MOB_KANAT_EN_DUS,
S_KAPI_BOY,S_MOB_KANAT_BOY_DUS,S_YAVRU_MOB_EN_DUS,S_YAVRU_KANAT_BOY_HES, S_SIP_TRH, S_IMODEL, S_DMODEL, S_Bolme_TUR,S_YAVRU_KANAT_EN_HES,
S_USTBOLME_ACK,KANATTUR.Kanat_Id,KANATTUR.kanat_turu, S_IRENK, S_DRENK,S_Ahsap_Not,S_AHSAP_BOY, S_CHK_CIFTKANAT,S_GITTI,S_NOT3, 
S_KAPI_TUR,S_KASAEXTRA,S_bolme_tur, CASE WHEN S_GrupToplam = ' ' THEN S_SIPARIS_NO ELSE S_GrupToplam END order by Gecici_sip_no ASC
) AS X
Order By X.S_GrupToplam


Böyle bir kullanımda iç sql sorgusundaki Order by ile elde ettiğiniz veri sırası, en dıştaki order by tarafından ezilecektir / geçersiz kılınacaktır.

Performans açısından iç sorgudaki order by kaldırılabilir.
noktaya kadar olan ilk sipariş noya göre sıralarsak işin çözülür sanırım,

önce ilk noktanın yerini bulalım, sonra bu indexten bir eksiğini left ile soldan alıp inte convert edelim,


 order by  convert(int,left( Gecici_sip_no , charindex('.', Gecici_sip_no )-1 ))

sql css hatalı gösterdiği için açık olarak da ekliyorum buraya

order by  convert(int,left( Gecici_sip_no , charindex('.', Gecici_sip_no )-1 ))


bu kod işini çözer sanıırm
Sizin sorunun çözümü çok basit bir şekilde CTE kullanarak İkinci sorguda gecici sip no alanını noktalardan kurtarıp 10 haneli integer çevirin. Sol 5 hane sağ 5 hane olarak buna göre sıralayın. CTE araştırın
Emekleriniz için teşekkür ederim ilk denemelerinde
order by convert(int,left( Gecici_sip_no , charindex('.', Gecici_sip_no )-1 )) --Gecici_sip_no grup by daki alanlar içinde olmadığından hata verdi

Msg 207, Level 16, State 1, Line 12 Invalid column name 'Gecici_sip_no'. Msg 207, Level 16, State 1, Line 12 Invalid column name 'Gecici_sip_no'.


@frmman kodunda

) AS X
Order By X.S_GrupToplam X ve X.S_GrupToplam işaretleyerek
Msg 102, Level 15, State 1, Line 15 Incorrect syntax near ')'.

hata verdi am bu bilgiler ışığında çözüm bulacağıma inanıyorum tüm emeği geçenlerden Allah c.c razı olsun.
S_GrupToplam alan adını "as" ile Gecici_sip_no şeklinde kullandığınızı yukarıdaki mesajımda fark edemedim.
Kendi sorgunuzdaki "order by Gecici_sip_no ASC kısmını çıkartın. Sorguyu şu şekilde deneyin.

Select * From (
select CASE WHEN S_GrupToplam = ' ' THEN S_SIPARIS_NO ELSE S_GrupToplam END As Gecici_sip_no,S_KAPI_MODEL,S_BAYI_KODU, S_BAYI_ADI,S_OZ_KOD, S_KAPI_EN,S_MOB_KANAT_EN_DUS,S_KAPI_BOY,S_MOB_KANAT_BOY_DUS,
S_YAVRU_MOB_EN_DUS,S_YAVRU_KANAT_BOY_HES,s_dismodelresim,S_SIP_TRH, S_IMODEL, S_DMODEL, S_Bolme_TUR,S_YAVRU_KANAT_EN_HES,S_USTBOLME_ACK, 
S_IRENK, S_DRENK,S_Ahsap_Not,S_AHSAP_BOY, S_CHK_CIFTKANAT,S_GITTI,S_NOT3, S_KAPI_TUR,S_KASAEXTRA,S_bolme_tur,S_Grup_kod,S_KANATTUR_ID, 
KANATTUR.Kanat_Id,KANATTUR.kanat_turu, SUM(CASE WHEN S_YON =  'SAG' THEN 1  END) AS say_Sag,SUM(CASE WHEN S_YON = 'SOL' THEN 1 END) AS say_Sol 

from Siparis LEFT JOIN KANATTUR ON  S_KANATTUR_ID = KANATTUR.Kanat_Id WHERE  S_BAYI_ADI ='HAYDAR SULTANY' and S_Mobilyasiz<>1 and S_GITTI<>1 AND
S_IMALAT_NO>=1 AND S_IMALAT_NO<=999999 AND S_SIPARIS_NO>=1 AND S_SIPARIS_NO<=999999 AND CONVERT(date,S_SIP_TRH,104) >= CONVERT(date,'01.08.2024',104)  AND
CONVERT(date,S_SIP_TRH,104) <= CONVERT(date,'19.08.2024',104)  

group by S_KANATTUR_ID,S_KAPI_MODEL,S_BAYI_KODU, S_BAYI_ADI,S_OZ_KOD, S_Grup_kod,s_dismodelresim,S_KAPI_EN,S_MOB_KANAT_EN_DUS,
S_KAPI_BOY,S_MOB_KANAT_BOY_DUS,S_YAVRU_MOB_EN_DUS,S_YAVRU_KANAT_BOY_HES, S_SIP_TRH, S_IMODEL, S_DMODEL, S_Bolme_TUR,S_YAVRU_KANAT_EN_HES,
S_USTBOLME_ACK,KANATTUR.Kanat_Id,KANATTUR.kanat_turu, S_IRENK, S_DRENK,S_Ahsap_Not,S_AHSAP_BOY, S_CHK_CIFTKANAT,S_GITTI,S_NOT3, 
S_KAPI_TUR,S_KASAEXTRA,S_bolme_tur, CASE WHEN S_GrupToplam = ' ' THEN S_SIPARIS_NO ELSE S_GrupToplam END
) AS X
Order By X.Gecici_sip_no ASC
(31-08-2024, Saat: 11:05)frmman Adlı Kullanıcıdan Alıntı: [ -> ]S_GrupToplam alan adını "as" ile Gecici_sip_no şeklinde kullandığınızı yukarıdaki mesajımda fark edemedim.
Kendi sorgunuzdaki "order by Gecici_sip_no ASC kısmını çıkartın. Sorguyu şu şekilde deneyin.

Select * From (
select CASE WHEN S_GrupToplam = ' ' THEN S_SIPARIS_NO ELSE S_GrupToplam END As Gecici_sip_no,S_KAPI_MODEL,S_BAYI_KODU, S_BAYI_ADI,S_OZ_KOD, S_KAPI_EN,S_MOB_KANAT_EN_DUS,S_KAPI_BOY,S_MOB_KANAT_BOY_DUS,
S_YAVRU_MOB_EN_DUS,S_YAVRU_KANAT_BOY_HES,s_dismodelresim,S_SIP_TRH, S_IMODEL, S_DMODEL, S_Bolme_TUR,S_YAVRU_KANAT_EN_HES,S_USTBOLME_ACK, 
S_IRENK, S_DRENK,S_Ahsap_Not,S_AHSAP_BOY, S_CHK_CIFTKANAT,S_GITTI,S_NOT3, S_KAPI_TUR,S_KASAEXTRA,S_bolme_tur,S_Grup_kod,S_KANATTUR_ID, 
KANATTUR.Kanat_Id,KANATTUR.kanat_turu, SUM(CASE WHEN S_YON =  'SAG' THEN 1  END) AS say_Sag,SUM(CASE WHEN S_YON = 'SOL' THEN 1 END) AS say_Sol 

from Siparis LEFT JOIN KANATTUR ON  S_KANATTUR_ID = KANATTUR.Kanat_Id WHERE  S_BAYI_ADI ='HAYDAR SULTANY' and S_Mobilyasiz<>1 and S_GITTI<>1 AND
S_IMALAT_NO>=1 AND S_IMALAT_NO<=999999 AND S_SIPARIS_NO>=1 AND S_SIPARIS_NO<=999999 AND CONVERT(date,S_SIP_TRH,104) >= CONVERT(date,'01.08.2024',104)  AND
CONVERT(date,S_SIP_TRH,104) <= CONVERT(date,'19.08.2024',104)  

group by S_KANATTUR_ID,S_KAPI_MODEL,S_BAYI_KODU, S_BAYI_ADI,S_OZ_KOD, S_Grup_kod,s_dismodelresim,S_KAPI_EN,S_MOB_KANAT_EN_DUS,
S_KAPI_BOY,S_MOB_KANAT_BOY_DUS,S_YAVRU_MOB_EN_DUS,S_YAVRU_KANAT_BOY_HES, S_SIP_TRH, S_IMODEL, S_DMODEL, S_Bolme_TUR,S_YAVRU_KANAT_EN_HES,
S_USTBOLME_ACK,KANATTUR.Kanat_Id,KANATTUR.kanat_turu, S_IRENK, S_DRENK,S_Ahsap_Not,S_AHSAP_BOY, S_CHK_CIFTKANAT,S_GITTI,S_NOT3, 
S_KAPI_TUR,S_KASAEXTRA,S_bolme_tur, CASE WHEN S_GrupToplam = ' ' THEN S_SIPARIS_NO ELSE S_GrupToplam END
) AS X
Order By X.Gecici_sip_no ASC

Hata vermeden sorgu çalıştı ama sonuç  aynı sıralama ilk resimdeki gibi  @vkamadan beyin önerdiği CTE üzerine çalışıyorum.

@frmman ve @bydelphi  verdiğiniz bilgileri birleştirdim geçici olsa da sonuç aldım teşekkür ederim. 

Çalışan kod 
Select * From (
select CASE WHEN S_GrupToplam = ' ' THEN S_SIPARIS_NO ELSE S_GrupToplam END As Gecici_sip_no,S_KAPI_MODEL,S_BAYI_KODU, S_BAYI_ADI,S_OZ_KOD, S_KAPI_EN,S_MOB_KANAT_EN_DUS,S_KAPI_BOY,S_MOB_KANAT_BOY_DUS,
S_YAVRU_MOB_EN_DUS,S_YAVRU_KANAT_BOY_HES,s_dismodelresim,S_SIP_TRH, S_IMODEL, S_DMODEL, S_YAVRU_KANAT_EN_HES,S_USTBOLME_ACK, 
S_IRENK, S_DRENK,S_Ahsap_Not,S_AHSAP_BOY, S_CHK_CIFTKANAT,S_GITTI,S_NOT3, S_KAPI_TUR,S_KASAEXTRA,S_bolme_tur,S_Grup_kod,S_KANATTUR_ID, 
KANATTUR.Kanat_Id,KANATTUR.kanat_turu, SUM(CASE WHEN S_YON =  'SAG' THEN 1  END) AS say_Sag,SUM(CASE WHEN S_YON = 'SOL' THEN 1 END) AS say_Sol 

from Siparis LEFT JOIN KANATTUR ON  S_KANATTUR_ID = KANATTUR.Kanat_Id WHERE  S_BAYI_ADI ='HAYDAR SULTANY' and S_Mobilyasiz<>1 and S_GITTI<>1 AND
S_IMALAT_NO>=1 AND S_IMALAT_NO<=999999 AND S_SIPARIS_NO>=1 AND S_SIPARIS_NO<=999999 AND CONVERT(date,S_SIP_TRH,104) >= CONVERT(date,'01.08.2024',104)  AND
CONVERT(date,S_SIP_TRH,104) <= CONVERT(date,'19.08.2024',104)  

group by S_KANATTUR_ID,S_KAPI_MODEL,S_BAYI_KODU, S_BAYI_ADI,S_OZ_KOD, S_Grup_kod,s_dismodelresim,S_KAPI_EN,S_MOB_KANAT_EN_DUS,
S_KAPI_BOY,S_MOB_KANAT_BOY_DUS,S_YAVRU_MOB_EN_DUS,S_YAVRU_KANAT_BOY_HES, S_SIP_TRH, S_IMODEL, S_DMODEL,S_YAVRU_KANAT_EN_HES,
S_USTBOLME_ACK,KANATTUR.Kanat_Id,KANATTUR.kanat_turu, S_IRENK, S_DRENK,S_Ahsap_Not,S_AHSAP_BOY, S_CHK_CIFTKANAT,S_GITTI,S_NOT3, 
S_KAPI_TUR,S_KASAEXTRA,S_bolme_tur, CASE WHEN S_GrupToplam = ' ' THEN S_SIPARIS_NO ELSE S_GrupToplam END
) AS X Order By convert(int,left( X.Gecici_sip_no, charindex(' .', X.Gecici_sip_no ) )) asc