2012-06-24 17 views
6

mam to proste zapytanie:Grupa warunkowa na serwerze sql?

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

będzie emitował:

enter image description here

teraz muszę tego samego zapytania, ale z GroupBy tylko rocznie:

tak:

SELECT YEAR(P.DateCreated) 

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

i dont chcesz wykonać 2 zapytania.

czy jest jakiś sposób, abym mógł zrobić to pod pojęciem group by tutaj?

mogę zrobić z jeden zostaje zastąpiony przez innego, ale cant zrobić jeden zastąpione przez dwa ...

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

pomocy?

Odpowiedz

14

można byłoby lepiej z dwóch oddzielnych zapytań, ale może nie podoba

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

jak WHEN @timeMode <> 'm' drugi GROUP BY wyrażenie będzie NULL dla wszystkich wierszy i nie wpłynie na wynik.

+0

jeśli dostarczam @ timeMode = "y", więc zapytanie będzie zawierało ',' na końcu .... error? –

+1

, więc muszę zacząć od _smallest_ grupy według jednostki, a następnie rozwinąć ją przez przypadek .... riught? –

+0

Nie jesteś pewien, o co pytasz. 'CASE' może zwrócić tylko jedno wyrażenie. To odpowiada na pytanie, które faktycznie zadałeś. –

5

Można użyć klauzuli over powrócić zarówno per-roczne i liczenia miesięcznie w jednym zapytaniu:

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

Nie widzę, jak to pomaga ... :) możesz rozwinąć proszę –

+0

To by zwróciło oba wyniki. Jeśli chcesz przełączyć zapytanie między dwoma trybami, zobacz odpowiedź @ MartinSmith! – Andomar

Powiązane problemy