2013-02-06 13 views
11

Mi stavo chiedendo se esiste un modo per ottenere due "conteggi" separati da una tabella utilizzando una query? Cioè, usando una tabella simile alla seguente vorrei recuperare ogni codice (distinto) e mostrare il numero totale di stato 'NOT uguale a X o D, e quindi avere una colonna aggiuntiva che mostra il numero totale di stato' uguale a X o D e la data di cancellazione è maggiore di una data specifica (ad esempio, gli ultimi 14 giorni).SQL: più affermazioni con più criteri

Tabella:

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 

Risultato di esempio (sulla base dei dati di cui sopra):

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

TotalNotXorD: ad esempio

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

TotalXorD: ad es.

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

Ho visto fare subquery ecc. Ma non riesco a ottenere i risultati che mi servono.

Qualche idea?

Grazie.

+0

cosa del database stai usando? – Michas

risposta

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 

o semplicemente facendo 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

Grazie per la tua risposta JW. Ho provato, ma sto ricevendo il seguente errore, che è simile ai problemi che stavo avendo io stesso: Errore: colonna 'stato' non è valido nell'elenco di selezione perché non è contenuto in una funzione di aggregazione o la GROUP BY clausola. (Stato: 37000, codice nativo: 1FB8) Errore: colonna 'stato' non è valido nell'elenco di selezione perché non è contenuto in una funzione di aggregazione o nella clausola GROUP BY. (Stato: 37000, codice nativo: 1FB8) – jj2

+0

vedere la mia risposta aggiornata. a proposito, che rdbms stai usando? –

+0

vedere qui per la demo http://www.sqlfiddle.com/#!2/aba2a/2 –

Problemi correlati