2013-02-06 21 views
11

Sadece bir sorgu kullanarak bir tablodan iki ayrı "sayım" toplamı elde etmenin herhangi bir yolu olup olmadığını merak ediyordum? Yani, aşağıdakine benzer bir tablo kullanarak, her bir kodu (ayrı) almak ve 'X veya D'ye eşit DEĞİL' statüsünün toplam sayısını göstermek ve daha sonra toplam durum sayısını gösteren ek bir sütuna sahip olmak istiyorum. X veya D ve iptal tarihi belirli bir tarihten daha büyüktür (son 14 gün).SQL: Farklı ölçütlere sahip çoklu sayı ifadeleri

Tablo: (yukarıdaki verilere göre)

Code: Status Cancel_Date 
----------------------------------- 
AAA X  2012-02-01 
AAA 
BBB X  2012-02-01 
AAA D  2012-01-01 
AAA 
BBB  
BBB D  2012-02-01 
BBB X  2012-01-01 

Örnek sonuç:

Code: TotalNotXorD  TotalXorD 
------------------------------------ 
AAA 2    1 
BBB 1    2 

TotalNotXorD: örneğin

select code, count(*) 
from table 
where status not in('X','D') 
group by code 

TotalXorD: ör.

select code, count(*) 
from table 
where status in('X','D') 
    and cancel_date >= '2012-02-01' 
group by code 

Alt sorgular vb. Inceledim, ancak ihtiyacım olan sonuçları elde edemiyorum.

Herhangi bir fikrin var mı?

Teşekkürler.

+0

yapıyor? – Michas

cevap

37

SELECT a.code, 
     COALESCE(b.totalNotXorD, 0) totalNotXorD, 
     COALESCE(c.totalXorD, 0) totalXorD, 
FROM (SELECT DISTINCT Code FROM tableName) a 
     LEFT JOIN 
     (
      select code, count(*) totalNotXorD 
      from table 
      where status not in('X','D') 
      group by code 
     ) b ON a.code = b.code 
     LEFT JOIN 
     (
      select code, count(*) totalXorD 
      from table 
      where status in('X','D') 
       and cancel_date >= '2012-02-01' 
      group by code 
     ) c ON a.code = c.code 

veya basitçe kullanıyorsunuz Ne veritabanı CASE

SELECT Code, 
     SUM(CASE WHEN status NOT IN ('X','D') OR status IS NULL THEN 1 ELSE 0 END) TotalNotXorD, 
     SUM(CASE WHEN status IN ('X','D') AND cancel_date >= '2012-02-01' THEN 1 ELSE 0 END) TotalXorD 
FROM tableName 
GROUP BY Code 
+0

Cevabınız için teşekkürler JW. Denedim ama kendim sahip olduğum sorunlara benzer olan aşağıdaki hatayı alıyorum: Hata: '' status '', bir toplu işlevde veya GROUP BY'de bulunmadığından select listesindeki geçersiz fıkra. (Durum: 37000, Yerel Kod: 1FB8) Hata: Toplama işlevinde veya GROUP BY deyiminde bulunmadığından, sütun 'durumu' seçim listesinde geçersiz. (Durum: 37000, Yerel Kod: 1FB8) – jj2

+0

Güncellenmiş cevabımı görün. Bu arada, ne rdbms kullanıyorsun? –

+0

Demo için buraya bakın http://www.sqlfiddle.com/#!2/aba2a/2 –