2013-02-06 11 views
11

Zastanawiam się, czy jest jakiś sposób, aby uzyskać dwie oddzielne "liczby" z tabeli przy użyciu jednego zapytania? Oznacza to, że używając tabeli podobnej do poniższej chciałbym pobrać każdy kod (odrębny) i pokazać całkowitą liczbę statusu "NIE równy X lub D, a następnie mieć dodatkową kolumnę, która pokazuje całkowitą liczbę statusu" równą do X lub D, a data anulowania jest większa niż podana data (na przykład ostatnie 14 dni).SQL: Wiele instrukcji liczenia o różnych kryteriach

Tabela:

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 

Przykład wynik (na podstawie powyższych danych)

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

TotalNotXorD: np

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

TotalXorD: np.

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

Zajrzałem do wykonywania podzapytań itp., Ale nie mogę uzyskać wymaganych wyników.

Wszelkie pomysły?

Dzięki.

+0

Co baza danych używasz? – Michas

Odpowiedz

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 

lub po prostu robi 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

Dzięki za odpowiedź JW. Próbowałem go, ale pojawia się następujący błąd, który jest podobny do problemów, które miałem sam: Błąd: kolumna "status" jest nieprawidłowy na liście select, ponieważ nie jest zawarty w funkcji agregującej lub GROUP BY klauzula. (State: 37000, kod macierzysty: 1FB8) Błąd: kolumna "status" jest niepoprawna na liście wyboru, ponieważ nie jest zawarta ani w funkcji agregującej, ani w klauzuli GROUP BY. (State: 37000, kod macierzysty: 1FB8) – jj2

+0

zobacz moją zaktualizowaną odpowiedź. tak przy okazji, z jakich rdbms korzystasz? –

+0

zobacz tutaj na demo http://www.sqlfiddle.com/#!2/aba2a/2 –