2012-06-24 15 views
6

Ho questa semplice query:Gruppo condizionale per in SQL Server?

SELECT YEAR(P.DateCreated) 
     ,MONTH(P.DateCreated) 
     ,COUNT(*) AS cnt 
FROM tbl1, 
     tbl2.... 
GROUP BY 
     MONTH(P.DateCreated) 
     ,YEAR(P.DateCreated) 

questo emetterà:

enter image description here

ora ho bisogno la stessa query, ma con groupby solo all'anno:

così:

SELECT YEAR(P.DateCreated) 

     ,COUNT(*) AS cnt 
FROM tbl1, 
     tbl2.... 
GROUP BY 
     YEAR(P.DateCreated) 

i non desidera effettuare 2 query.

c'è un modo che posso fare con conteggio qui?

posso fare con un essere sostituito da un altro, ma io non posso fare uno è sostituito da due ...

GROUP BY 
    CASE WHEN @timeMode='y' THEN YEAR(P.DateCreated) 
      WHEN @timeMode='m' THEN MONTH(P.DateCreated), YEAR(P.DateCreated) end 

enter image description here

alcun aiuto?

risposta

14

si sarebbe meglio con due query separate ma può farlo come

GROUP BY YEAR(P.DateCreated), 
     CASE 
      WHEN @timeMode='m' THEN MONTH(P.DateCreated) end 

come WHEN @timeMode <> 'm' secondo GROUP BY espressione sarà NULL per tutte le righe e non influisce sul risultato.

+0

se fornisco @ timeMode = 'y' quindi la query avrà ',' alla fine .... errore? –

+1

quindi devo iniziare da _smallest_ group per unità e poi espanderlo per caso .... riught? –

+0

Non sei sicuro di cosa stai chiedendo. 'CASE' può restituire solo una singola espressione. Questo risponde alla domanda che hai effettivamente chiesto. –

5

Si potrebbe utilizzare una clausola over per tornare sia il per-annuale e il conto al mese in una query:

SELECT distinct YEAR(P.DateCreated) as Year 
,  MONTH(P.DateCreated) as Month 
,  COUNT(*) over (partition by YEAR(P.DateCreated), MONTH(P.DateCreated)) 
      as MonthCount 
,  COUNT(*) over (partition by YEAR(P.DateCreated)) as YearCount 
FROM YourTable P 

Live example at SQL Fiddle.

+0

non vedo come può essere d'aiuto ... :) puoi elaborare per favore –

+0

Restituirebbe entrambi i risultati. Se desideri attivare la query tra due modalità, consulta la risposta di @ MartinSmith! – Andomar