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: 379
Kayıt: 31 Eki 2005 03:26

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

Mesaj gönderen turkcanfidan » 23 Ara 2005 12:37

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 09:11

Mesaj gönderen naile » 23 Ara 2005 12:55

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: 379
Kayıt: 31 Eki 2005 03:26

Mesaj gönderen turkcanfidan » 23 Ara 2005 01:28

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 » 23 Ara 2005 02:07

Ş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: 379
Kayıt: 31 Eki 2005 03:26

Mesaj gönderen turkcanfidan » 23 Ara 2005 03:01

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 » 28 Ara 2005 03:24

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 01:44

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

Mesaj gönderen opordace » 10 Şub 2018 02:28

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;

Cevapla