Hayırlı günler.
İnşaallah soruyu doğru sorabilirim
Aşağıdaki sql sorgusu ile resimdeki sonucu alıyorum resim 1
gridde 1 ve 2 satırdaki her şey aynı sadece sağ sol yön farklı olduğundan group by 2 ayrı satır da grupluyor
ben bunu nasıl tek satırda paint ile değiştirdiğim resim 2 gibi alabilirim mümkün mü ?
Bilgi için yazıyorum SQL sorgusundan yön kaldırımca sağ sol ayırt etmeden Adet 5 oluyor benin yön bilgisinede ihtiyacım var.
Resim 1
select case S_KANATTUR_ID
when 0 then 'TEK KANAT' when 1 then 'TEK KANAT ÜST BÖLMELİ' when 2 then 'TEK KANAT SAG BÖLMELİ' when 3 then 'TEK KANAT SOL BÖLMELİ'
when 4 then 'TEK KANAT SAG / SOL BÖLMELİ' when 5 then 'TEK KANAT ÜST VE SAG BÖLMELİ' when 6 then 'TEK KANAT ÜST VE SOL BÖLMELİ'
when 7 then 'TEK KANAT ÜST VE SAG / SOL BÖLMELİ' when 8 then 'ÇİFT KANAT' when 9 then 'ÇİFT KANAT ÜST BÖLMELİ' when 10 then 'ÇİFT KANAT SAG BÖLMELİ'
when 11 then 'ÇİFT KANAT SOL BÖLMELİ' when 12 then 'ÇİFT KANAT SAG / SOL BÖLMELİ' when 13 then 'ÇİFT KANAT ÜST VE SAG BÖLMELİ'
when 14 then 'ÇİFT KANAT ÜST VE SOL BÖLMELİ' when 15 then 'ÇİFT KANAT ÜST VE SAG / SOL BÖLMELİ' when 16 then 'TEK KANAT CAM BÖLMELİ'
when 17 then 'ÇİFT KANAT CAM BÖLMELİ' Else 'Hatalı Kapı Türü ' end as S_kanat_tur, COUNT(*) as say,
S_YON,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,
S_IRENK, S_DRENK,S_Ahsap_Not,S_AHSAP_BOY,S_CHK_CIFTKANAT,S_NOT3, S_KAPI_TUR,S_KASAEXTRA,S_bolme_tur,
CASE WHEN S_GrupToplam = ' ' THEN S_SIPARIS_NO ELSE S_GrupToplam END As Gecici_sip_no
from Siparis
WHERE S_BAYI_ADI ='Çınar Çelik Kapı' 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.01.2024',104) AND CONVERT(date,S_SIP_TRH,104) <= CONVERT(date,'15.07.2024',104)
group by
S_KANATTUR_ID,S_YON,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,
S_IRENK, S_DRENK,S_Ahsap_Not,S_AHSAP_BOY, S_CHK_CIFTKANAT,S_NOT3, S_KAPI_TUR,S_KASAEXTRA,S_bolme_tur,
CASE WHEN S_GrupToplam = ' ' THEN S_SIPARIS_NO ELSE S_GrupToplam END order by CONVERT(date,S_SIP_TRH,104) ASC
"…De ki: "Hiç bilenlerle bilmeyenler bir olur mu? Şüphesiz, temiz akıl sahipleri öğüt alıp-düşünürler" (Zümer Suresi, 9)
üstat şahsen net bilgim yok ama merakımdan dolayı chatgpt ye yazdım. belki işini görür düşüncesi ile ürettiği kodu paylaşıyorum. Birebir olmasa bile bir şekilde yol göstereceğini düşünüyorum.
SELECT
CASE S_KANATTUR_ID
WHEN 0 THEN 'TEK KANAT'
WHEN 1 THEN 'TEK KANAT ÜST BÖLMELİ'
WHEN 2 THEN 'TEK KANAT SAG BÖLMELİ'
WHEN 3 THEN 'TEK KANAT SOL BÖLMELİ'
WHEN 4 THEN 'TEK KANAT SAG / SOL BÖLMELİ'
WHEN 5 THEN 'TEK KANAT ÜST VE SAG BÖLMELİ'
WHEN 6 THEN 'TEK KANAT ÜST VE SOL BÖLMELİ'
WHEN 7 THEN 'TEK KANAT ÜST VE SAG / SOL BÖLMELİ'
WHEN 8 THEN 'ÇİFT KANAT'
WHEN 9 THEN 'ÇİFT KANAT ÜST BÖLMELİ'
WHEN 10 THEN 'ÇİFT KANAT SAG BÖLMELİ'
WHEN 11 THEN 'ÇİFT KANAT SOL BÖLMELİ'
WHEN 12 THEN 'ÇİFT KANAT SAG / SOL BÖLMELİ'
WHEN 13 THEN 'ÇİFT KANAT ÜST VE SAG BÖLMELİ'
WHEN 14 THEN 'ÇİFT KANAT ÜST VE SOL BÖLMELİ'
WHEN 15 THEN 'ÇİFT KANAT ÜST VE SAG / SOL BÖLMELİ'
WHEN 16 THEN 'TEK KANAT CAM BÖLMELİ'
WHEN 17 THEN 'ÇİFT KANAT CAM BÖLMELİ'
ELSE 'Hatalı Kapı Türü '
END AS S_kanat_tur,
SUM(CASE WHEN S_YON = 'Sağ' THEN 1 ELSE 0 END) AS say_Sag,
SUM(CASE WHEN S_YON = 'Sol' THEN 1 ELSE 0 END) AS say_Sol,
COUNT(*) AS toplam_adet,
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,
S_IRENK,
S_DRENK,
S_Ahsap_Not,
S_AHSAP_BOY,
S_CHK_CIFTKANAT,
S_NOT3,
S_KAPI_TUR,
S_KASAEXTRA,
S_bolme_tur,
CASE
WHEN S_GrupToplam = ' ' THEN S_SIPARIS_NO
ELSE S_GrupToplam
END AS Gecici_sip_no
FROM Siparis
WHERE
S_BAYI_ADI ='Çınar Çelik Kapı'
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.01.2024', 104)
AND CONVERT(date, S_SIP_TRH, 104) <= CONVERT(date, '15.07.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,
S_IRENK,
S_DRENK,
S_Ahsap_Not,
S_AHSAP_BOY,
S_CHK_CIFTKANAT,
S_NOT3,
S_KAPI_TUR,
S_KASAEXTRA,
S_bolme_tur,
CASE
WHEN S_GrupToplam = ' ' THEN S_SIPARIS_NO
ELSE S_GrupToplam
END
ORDER BY
CONVERT(date, S_SIP_TRH, 104) ASC;
Verinin yapısını tam bilmemekle beraber,
sağ sol yön sütununu group by dan kaldırıp, min(sag) - max(sol) gibi bir grup fonksiyonla getirmek işimi çözebilir mi.
satırı teke indiirirsiniz ama veri yapınızla uyuşurmu ona sizin karar vermeniz lazım.
ayrıca S_KANATTUR_ID case yapınız yerine bir fonksiyon yazmanız sorgunuz daha dinamik ve sade hale getirecektir.
create function dbo.fn_KanatType(@S_KANATTUR_ID int)
returns varchar(60)
as
begin
return case @S_KANATTUR_ID
when 0 then 'TEK KANAT'
when 1 then 'TEK KANAT ÜST BÖLMELİ'
when 2 then 'TEK KANAT SAG BÖLMELİ'
when 3 then 'TEK KANAT SOL BÖLMELİ'
when 4 then 'TEK KANAT SAG / SOL BÖLMELİ'
when 5 then 'TEK KANAT ÜST VE SAG BÖLMELİ'
when 6 then 'TEK KANAT ÜST VE SOL BÖLMELİ'
when 7 then 'TEK KANAT ÜST VE SAG / SOL BÖLMELİ'
when 8 then 'ÇİFT KANAT'
when 9 then 'ÇİFT KANAT ÜST BÖLMELİ'
when 10 then 'ÇİFT KANAT SAG BÖLMELİ'
when 11 then 'ÇİFT KANAT SOL BÖLMELİ'
when 12 then 'ÇİFT KANAT SAG / SOL BÖLMELİ'
when 13 then 'ÇİFT KANAT ÜST VE SAG BÖLMELİ'
when 14 then 'ÇİFT KANAT ÜST VE SOL BÖLMELİ'
when 15 then 'ÇİFT KANAT ÜST VE SAG / SOL BÖLMELİ'
when 16 then 'TEK KANAT CAM BÖLMELİ'
when 17 then 'ÇİFT KANAT CAM BÖLMELİ'
Else 'Hatalı Kapı Türü '
end
end
Kalan ömrünün en genç build’indesin.
Counter artar, deadline sabit.
Age++ çalışıyor, rollback yok.
Her yer exception
@bydelphi hocam scalar function yerine table function yapmak daha doğru olmaz mı kayıt sayıları çok olduğunda scaler function çok yavaş kalabilir düşüncesindeyim.
Create FUNCTION [dbo].[fnt_Tanimlar] ( )
RETURNS @Tanimlar Table (Id Integer, Tanim Varchar(250))
AS
BEGIN
Insert @Tanimlar (Id, Tanim)
Values (Null, 'Hatalı Kapı Türü '),
(0 , 'TEK KANAT'),
(1, 'TEK KANAT ÜST BÖLMELİ'),
(2, 'TEK KANAT SAG BÖLMELİ'),
(3, 'TEK KANAT SOL BÖLMELİ'),
(4, 'TEK KANAT SAG / SOL BÖLMELİ'),
(5, 'TEK KANAT ÜST VE SAG BÖLMELİ'),
(6, 'TEK KANAT ÜST VE SOL BÖLMELİ'),
(7, 'TEK KANAT ÜST VE SAG / SOL BÖLMELİ'),
(8, 'ÇİFT KANAT'),
(9, 'ÇİFT KANAT ÜST BÖLMELİ'),
(10, 'ÇİFT KANAT SAG BÖLMELİ'),
(11, 'ÇİFT KANAT SOL BÖLMELİ'),
(12, 'ÇİFT KANAT SAG / SOL BÖLMELİ'),
(13, 'ÇİFT KANAT ÜST VE SAG BÖLMELİ'),
(14, 'ÇİFT KANAT ÜST VE SOL BÖLMELİ'),
(15, 'ÇİFT KANAT ÜST VE SAG / SOL BÖLMELİ'),
(16, 'TEK KANAT CAM BÖLMELİ'),
(17, 'ÇİFT KANAT CAM BÖLMELİ')
Return
end
Select * From dbo.fnt_Tanimlar()
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz.
(16-07-2024, Saat: 10:21)adelphiforumz Adlı Kullanıcıdan Alıntı: @bydelphi hocam scalar function yerine table function yapmak daha doğru olmaz mı kayıt sayıları çok olduğunda scaler function çok yavaş kalabilir düşüncesindeyim.
Create FUNCTION [dbo].[fnt_Tanimlar] ( )
RETURNS @Tanimlar Table (Id Integer, Tanim Varchar(250))
AS
BEGIN
Insert @Tanimlar (Id, Tanim)
Values (Null, 'Hatalı Kapı Türü '),
(0 , 'TEK KANAT'),
(1, 'TEK KANAT ÜST BÖLMELİ'),
(2, 'TEK KANAT SAG BÖLMELİ'),
(3, 'TEK KANAT SOL BÖLMELİ'),
(4, 'TEK KANAT SAG / SOL BÖLMELİ'),
(5, 'TEK KANAT ÜST VE SAG BÖLMELİ'),
(6, 'TEK KANAT ÜST VE SOL BÖLMELİ'),
(7, 'TEK KANAT ÜST VE SAG / SOL BÖLMELİ'),
(8, 'ÇİFT KANAT'),
(9, 'ÇİFT KANAT ÜST BÖLMELİ'),
(10, 'ÇİFT KANAT SAG BÖLMELİ'),
(11, 'ÇİFT KANAT SOL BÖLMELİ'),
(12, 'ÇİFT KANAT SAG / SOL BÖLMELİ'),
(13, 'ÇİFT KANAT ÜST VE SAG BÖLMELİ'),
(14, 'ÇİFT KANAT ÜST VE SOL BÖLMELİ'),
(15, 'ÇİFT KANAT ÜST VE SAG / SOL BÖLMELİ'),
(16, 'TEK KANAT CAM BÖLMELİ'),
(17, 'ÇİFT KANAT CAM BÖLMELİ')
Return
end
Select * From dbo.fnt_Tanimlar()
Evet haklısın üstad,
örneğin onbinlerce satırlık bir result da , herbir satır için fonksiyon içindeki case yapısısının onbinlerce kez dönmesi ne göre
from da belirtilen table type fonksiyonun bir kere çalışıp referans üzerinden joinlenmesi daha hızlı sonuç verecektir kesinlikle.
projenin yapısına göre eğer kullanıcı manipulasyonu varsa fiziksel tabloda, manipulasyon yoksa statik ise skaler veya table type fonksiyon kullanıyorum duruma göre.
ama data büyükse table type fonksiyonun çok ciddi avantajı olacaktır dediğin gibi.
elimdeki büyük bir data da performans karşılaştırması yapıp , bunu belgeleyelim somutlaştıralım üstad.
Kalan ömrünün en genç build’indesin.
Counter artar, deadline sabit.
Age++ çalışıyor, rollback yok.
Her yer exception
(16-07-2024, Saat: 08:37)SercanTEK Adlı Kullanıcıdan Alıntı: üstat şahsen net bilgim yok ama merakımdan dolayı chatgpt ye yazdım. belki işini görür düşüncesi ile ürettiği kodu paylaşıyorum. Birebir olmasa bile bir şekilde yol göstereceğini düşünüyorum.
SELECT
CASE S_KANATTUR_ID
WHEN 0 THEN 'TEK KANAT'
WHEN 1 THEN 'TEK KANAT ÜST BÖLMELİ'
WHEN 2 THEN 'TEK KANAT SAG BÖLMELİ'
WHEN 3 THEN 'TEK KANAT SOL BÖLMELİ'
WHEN 4 THEN 'TEK KANAT SAG / SOL BÖLMELİ'
WHEN 5 THEN 'TEK KANAT ÜST VE SAG BÖLMELİ'
WHEN 6 THEN 'TEK KANAT ÜST VE SOL BÖLMELİ'
WHEN 7 THEN 'TEK KANAT ÜST VE SAG / SOL BÖLMELİ'
WHEN 8 THEN 'ÇİFT KANAT'
WHEN 9 THEN 'ÇİFT KANAT ÜST BÖLMELİ'
WHEN 10 THEN 'ÇİFT KANAT SAG BÖLMELİ'
WHEN 11 THEN 'ÇİFT KANAT SOL BÖLMELİ'
WHEN 12 THEN 'ÇİFT KANAT SAG / SOL BÖLMELİ'
WHEN 13 THEN 'ÇİFT KANAT ÜST VE SAG BÖLMELİ'
WHEN 14 THEN 'ÇİFT KANAT ÜST VE SOL BÖLMELİ'
WHEN 15 THEN 'ÇİFT KANAT ÜST VE SAG / SOL BÖLMELİ'
WHEN 16 THEN 'TEK KANAT CAM BÖLMELİ'
WHEN 17 THEN 'ÇİFT KANAT CAM BÖLMELİ'
ELSE 'Hatalı Kapı Türü '
END AS S_kanat_tur,
SUM(CASE WHEN S_YON = 'Sağ' THEN 1 ELSE 0 END) AS say_Sag,
SUM(CASE WHEN S_YON = 'Sol' THEN 1 ELSE 0 END) AS say_Sol,
COUNT(*) AS toplam_adet,
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,
S_IRENK,
S_DRENK,
S_Ahsap_Not,
S_AHSAP_BOY,
S_CHK_CIFTKANAT,
S_NOT3,
S_KAPI_TUR,
S_KASAEXTRA,
S_bolme_tur,
CASE
WHEN S_GrupToplam = ' ' THEN S_SIPARIS_NO
ELSE S_GrupToplam
END AS Gecici_sip_no
FROM Siparis
WHERE
S_BAYI_ADI ='Çınar Çelik Kapı'
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.01.2024', 104)
AND CONVERT(date, S_SIP_TRH, 104) <= CONVERT(date, '15.07.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,
S_IRENK,
S_DRENK,
S_Ahsap_Not,
S_AHSAP_BOY,
S_CHK_CIFTKANAT,
S_NOT3,
S_KAPI_TUR,
S_KASAEXTRA,
S_bolme_tur,
CASE
WHEN S_GrupToplam = ' ' THEN S_SIPARIS_NO
ELSE S_GrupToplam
END
ORDER BY
CONVERT(date, S_SIP_TRH, 104) ASC;
Merhabalar,
Veritabanı size ait ise tarih alanlarını DateTime olarak oluşturmamanızı öneririm.
Büyük sorgularda CONVERT işlemi index dahi olsa ağırlaştırıyor.
Bunun yerine DATE için bir alan, TIME için bir alan kullanın.
Eğer yapamıyorsanız DateTime alanını '2024-07-16 00:00:00' şeklinde CONVERT kullanmadan sorgulayabilrsiniz.
Allah c.c hepinizden razı olsun dediklerinizi uyguladım kanat türünü tablo yaptım LEFT JOIN ile bağladım.
S_YON sorgudan çıkardım say_sag ve say_sol ekleyerek sonuca ulaştım.
select S_KANATTUR_ID,COUNT(*) as say,S_KAPI_MODEL,S_BAYI_KODU, S_BAYI_ADI,S_OZ_KOD, S_Grup_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,
CASE WHEN S_GrupToplam = ' ' THEN S_SIPARIS_NO ELSE S_GrupToplam END As Gecici_sip_no, KANATTUR.Kanat_Id,KANATTUR.kanat_turu,
SUM(CASE WHEN S_YON = 'SAG' THEN 1 ELSE 0 END) AS say_Sag,SUM(CASE WHEN S_YON = 'SOL' THEN 1 ELSE 0 END) AS say_Sol
from Siparis LEFT JOIN KANATTUR ON S_KANATTUR_ID = KANATTUR.Kanat_Id WHERE S_BAYI_ADI ='Çınar Çelik Kapı' 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.01.2024',104)
AND CONVERT(date,S_SIP_TRH,104) <= CONVERT(date,'16.07.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 S_KAPI_MODEL
"…De ki: "Hiç bilenlerle bilmeyenler bir olur mu? Şüphesiz, temiz akıl sahipleri öğüt alıp-düşünürler" (Zümer Suresi, 9)