2012-06-24 10 views
6

tengo esta consulta sencilla:¿Grupo condicional por servidor sql?

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

este emitirá:

enter image description here

ahora tengo la misma consulta pero con GroupBy única por año:

manera:

SELECT YEAR(P.DateCreated) 

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

i no haga desea hacer 2 consultas.

¿Hay alguna manera que yo pueda hacer conitional group by aquí?

puedo hacer con que está siendo reemplazado por otro, pero no puede hacer que está siendo reemplazado por dos ...

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

ayuda?

Respuesta

14

Usted sería mejor con dos consultas separadas pero puedo hacerlo como

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

como WHEN @timeMode <> 'm' la segunda GROUP BY expresión será NULL para todas las filas y no afecta el resultado.

+0

si proporciono @ timeMode = 'y' entonces la consulta tendrá ',' al final ... ¿error? –

+1

entonces debo comenzar desde _smallest_ group por unidad, y luego expandirlo por caso ... ¿riught? –

+0

No estoy seguro de lo que está preguntando. 'CASE' solo puede devolver una sola expresión. Esto responde la pregunta que realmente hizo. –

5

usted podría utilizar una cláusula over para devolver tanto el per-anual y el número de ejemplares por meses en una consulta:

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

no veo cómo ayuda ... :) puede elaborar por favor –

+0

Devolvería ambos resultados. Si desea alternar la consulta entre dos modos, consulte la respuesta de @ MartinSmith. – Andomar