ADI SOYADI OCAK ŞUBAT MART NİSAN ... .... ....
------------------ --------- --------- --------- --------
AHMET 345.45 123.21 874.23 . ... . . . ..
MEHMET 767.54 67.87 .... . . .. . . ..
.....
....
....
(İSİMLER BİR TABLEDA KAYITLI)
isimlerin olduğu bir tablom var, hareketlerin olduğu tablodan birden fazla koşula göre sorgulama yapıp farklı sütunlarda göstermek istiyorum. a sütünunun koşulu farklı b sütunu farklı. bu ayrı sorguları MS SQL Server kullanarak nasıl birleştirebilirim?
SELECT Isim,
(SELECT Deger FROM Tablo T2 WHERE T2.ID=T1.ID AND T2.Ay=1) AS Ocak,
(SELECT Deger FROM Tablo T2 WHERE T2.ID=T1.ID AND T2.Ay=2) AS Şubat
FROM Tablo T1
Group by ID
ID, sizin her bir isim için tuttuğunuz key olarak düşünüldü. Eğer her satır için hangi ay olduğu değer değil de tarih değeri tutuluyorsa,ayı bulmak için MONTH fonksiyonunu kullanabilirsiniz.
select ID, ADISOYADI,
(SELECT SUM(CIKANMIKT*BIRIMFIYAT) DEGER FROM FOLYO F WHERE M.ID = F.ID AND MONTH(TARIH) = 1 AND YEAR(TARIH) = 2005) AS OCAK,
(SELECT SUM(CIKANMIKT*BIRIMFIYAT) DEGER FROM FOLYO F WHERE M.ID = F.ID AND MONTH(TARIH) = 2 AND YEAR(TARIH) = 2005) AS ŞUBAT,
(SELECT SUM(CIKANMIKT*BIRIMFIYAT) DEGER FROM FOLYO F WHERE M.ID = F.ID AND MONTH(TARIH) = 3 AND YEAR(TARIH) = 2005) AS MART,
(SELECT SUM(CIKANMIKT*BIRIMFIYAT) DEGER FROM FOLYO F WHERE M.ID = F.ID AND MONTH(TARIH) = 4 AND YEAR(TARIH) = 2005) AS NISAN,
(SELECT SUM(CIKANMIKT*BIRIMFIYAT) DEGER FROM FOLYO F WHERE M.ID = F.ID AND MONTH(TARIH) = 5 AND YEAR(TARIH) = 2005) AS MAYIS,
(SELECT SUM(CIKANMIKT*BIRIMFIYAT) DEGER FROM FOLYO F WHERE M.ID = F.ID AND MONTH(TARIH) = 6 AND YEAR(TARIH) = 2005) AS HAZIRAN
FROM MUSTERILER M
GROUP BY ID, ADISOYADI
şeklinde yaptım, sonuç MÜKEMMEL! Çok teşekkürler. Birini yüzüne karşı övmeyi sevmem ama nasıl olsa yazışıyoruz. SQL hakkında koskoca bir kitap var, böyle bir şey bulamadım. Bu konuda çok iyi olmalısınız.
SELECT
M.ID,
M.ADISOYADI,
SUM(CASE WHEN MONTH(F.TARIH) = 1 THEN F.DEGER ELSE 0.0 END) AS OCAK,
SUM(CASE WHEN MONTH(F.TARIH) = 2 THEN F.DEGER ELSE 0.0 END) AS SUBAT,
SUM(CASE WHEN MONTH(F.TARIH) = 3 THEN F.DEGER ELSE 0.0 END) AS MART,
SUM(CASE WHEN MONTH(F.TARIH) = 4 THEN F.DEGER ELSE 0.0 END) AS NISAN,
SUM(CASE WHEN MONTH(F.TARIH) = 5 THEN F.DEGER ELSE 0.0 END) AS MAYIS,
SUM(CASE WHEN MONTH(F.TARIH) = 6 THEN F.DEGER ELSE 0.0 END) AS HAZIRAN,
SUM(CASE WHEN MONTH(F.TARIH) = 7 THEN F.DEGER ELSE 0.0 END) AS TEMMUZ,
SUM(CASE WHEN MONTH(F.TARIH) = 8 THEN F.DEGER ELSE 0.0 END) AS AGUSTOS,
SUM(CASE WHEN MONTH(F.TARIH) = 9 THEN F.DEGER ELSE 0.0 END) AS EYLUL,
SUM(CASE WHEN MONTH(F.TARIH) = 10 THEN F.DEGER ELSE 0.0 END) AS EKIM,
SUM(CASE WHEN MONTH(F.TARIH) = 11 THEN F.DEGER ELSE 0.0 END) AS KASIM,
SUM(CASE WHEN MONTH(F.TARIH) = 12 THEN F.DEGER ELSE 0.0 END) AS ARALIK
FROM MUSTERILER M
INNER JOIN FOLYO F ON (M.ID = F.ID)
WHERE YEAR(F.TARIH) = 2005
GROUP BY M.ID, M.ADISOYADI
sizin örnek te güzel, sonuçta farklı şeyler öğreniyoruz, fakat sizin sorgu 10 sn de hesaplanırken, Naile Hanım'ın sorgusu 7 sn de. Demekki o yöntem daha az zorluyor Server ı. Bunu 1.2 milyon kaydın olduğu bir table da denedim. Programın performansı açısından 3 sn bile önemli. Case-when ifadesini bilmiyordum, onu da öğrenmiş olduk. Teşekkürler...
Merhaba Arkadaşlar,
İki farklı tablo da iki ayrı sorgu yaptım, ve bu iki sorgu sonucunu birleştirmek istiyorum. Sorgular aşağıdadır. İkinci sorgudaki KullanilanToplam alanı birinci sorguya eklensin. (1. sorgudaki MainId ile 2. sorgudaki MalzemeId aynı ise eklesin)
ADOQuery2.SQL.Add('Select Sube,MainId,StokEtki,MlzAd,SUM(Case When HareketTip=1 Then MlzAdet*MainCarpan else 0 end) as Çıkan,AVG(Case When HareketTip=0 Then SumStokBirim end) as Ortalama,SUM(Case When HareketTip=0 or HareketTip=5 Then MlzAdet*MainCarpan else 0 end) as Gelen');
ADOQuery2.SQL.Add('from vw_ext_StokHareket');
ADOQuery2.SQL.Add('Where StokEtki=1 and Sube=1 GROUP BY Sube,MlzAd,StokEtki Order BY MlzAd ASC');
ADOQuery4.close;
ADOQuery4.sql.clear;
ADOQuery4.SQL.Add('Select MalzemeId,SUM(KullanilanToplam) as Kullanım from vw_ext_Mlz_Kullanim Where Sube=1 Group By MalzemeId Order By MalzemeId');
ADOQuery4.open;
kolay gelsin normalde stok kodu miktarı durumu(giren yada çıkan ) olarak listelenen kayıtları tek satırda listelemeye çalışıyorum ancak sonuç çıkmıyor kodun neresinde sıkıntı var acaba?
SELECT STOKKODU,
(select SUM(MIKTARI) from StokHRKT b where b.STOKKODU=a.STOKKODU AND b.BELGETIPI='GIREN' )as giren,
(select SUM(MIKTARI) from StokHRKT c where c.STOKKODU=a.STOKKODU AND b.BELGETIPI='CIKAN' )as cikan
FROM StokHRKT a
GROUP BY STOKKODU
Haksız bir davada zirve olmaktansa, haklı bir davada zerre olmayı tercih ederim.
select
STOKKODU,
sum(case when BELGETIPI='GIREN' then MIKTARI end) as giren,
sum(case when BELGETIPI='CIKAN' then MIKTARI end) as cikan
from StokHRKT group by STOKKODU
Eğer sorun yaşıyorsanız kayıtlarda problem olabilir. İyi çalışmalar.
Şaban Şahin AKMAN
_________________ Derin olan kuyu değil kısa olan iptir. - .