SQL'de birden fazla sorgunun sonuçlarını birleştirme

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
turkcanfidan
Üye
Mesajlar: 380
Kayıt: 31 Eki 2005 03:26

SQL'de birden fazla sorgunun sonuçlarını birleştirme

Mesaj gönderen turkcanfidan »

selam,

örneğin şöyle bir sorgu elde etmek istiyorum,

Kod: Tümünü seç

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?

iyi çalışmalar.
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Tablo yapınızı yazmadığınızdan tahmini olarak şöyle bir sorgu işinizi görebilir:

Kod: Tümünü seç

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.
turkcanfidan
Üye
Mesajlar: 380
Kayıt: 31 Eki 2005 03:26

Mesaj gönderen turkcanfidan »

Sorguyu,

Kod: Tümünü seç

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.

Bu sorguda 2005 yerine parametre kullanılabilir.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Şunu da deneyin isterseniz:

Kod: Tümünü seç

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
İyi çalışmalar.
turkcanfidan
Üye
Mesajlar: 380
Kayıt: 31 Eki 2005 03:26

Mesaj gönderen turkcanfidan »

Hakan Bey,

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...
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Mesaj gönderen tuanna »

anlamadığım husus bu nasıl bir kitap bu tip kullanım bir sql nin yardımında var emin ol bu forumda daha fazlası var...kitabı merak ettim...
Siz hayal edin...Biz yapalım TuannaSoft...
opordace
Üye
Mesajlar: 15
Kayıt: 28 Nis 2015 02:44

Re: SQL'de birden fazla sorgunun sonuçlarını birleştirme

Mesaj gönderen opordace »

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;
Kullanıcı avatarı
enes6635
Üye
Mesajlar: 21
Kayıt: 09 Eki 2018 11:09
İletişim:

Re: SQL'de birden fazla sorgunun sonuçlarını birleştirme

Mesaj gönderen enes6635 »

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?

Kod: Tümünü seç

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.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: SQL'de birden fazla sorgunun sonuçlarını birleştirme

Mesaj gönderen sabanakman »

İyi günler.

Kod: Tümünü seç

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. - .
Cevapla