2011-01-11 7 views
5

Tengo la siguiente consulta sencilla,Dónde condición cláusula sobre las funciones de agregado

SELECT US_LOGON_NAME as Username, 
COUNT(I.IS_ISSUE_NO) as Issues 
FROM ISSUES I JOIN USERS U ON I.IS_ASSIGNED_USER_ID = U.US_USER_ID 
WHERE I.IS_RECEIVED_DATETIME BETWEEN 20110101000000 AND 20110107000000 
GROUP BY U.US_LOGON_NAME; 

Donde Quiero añadir RECUENTO adicional() para la lista de selección, sino imponer ciertas condiciones donde en ellos. ¿Esto se hace con una declaración CASE() de alguna manera? Traté de poner cláusulas Where dentro de la lista de selección, y eso no parece estar permitido. No estoy seguro si las subconsultas son realmente necesarias aquí, pero no lo creo.

Por ejemplo quiero función de un cargo() que sólo cuenta cuestiones dentro de un cierto rango, y luego otro en otro rango o con otras condiciones variadas, etc:

SELECT US_LOGON_NAME as Username, 
COUNT(I.IS_ISSUE_NO (condition here) 
COUNT(I.IS_ISSUE_NO (a different condition here) 

etc ...

Aún agrupados por nombre de inicio de sesión.

Gracias.

Respuesta

10
SELECT 
    SUM(CASE WHEN I.IS_ISSUE_NO (condition here) THEN 1 ELSE 0 END) AS COND1 
    SUM(CASE WHEN I.IS_ISSUE_NO (condition here) THEN 1 ELSE 0 END) AS COND2 
+0

¿No '' COUNT' también cuentan 0'? Pensé que solo 'NULL' no se contaba. –

+1

@Kirk Woll: ¿Dónde dice COUNT en su respuesta? –

+0

Sí, pero Adam no está contando, está SUMANDO. –

4

Un par de soluciones.

Puede aprovechar el hecho de que SQL no cuenta valores NULL:

SELECT US_LOGON_NAME as Username, 
    COUNT(CASE WHEN <cond>  THEN I.IS_ISSUE_NO ELSE NULL END) 
    COUNT(CASE WHEN <other cond> THEN I.IS_ISSUE_NO ELSE NULL END) 
    . . . 

o puede utilizar SUM en lugar de COUNT:

SELECT US_LOGON_NAME as Username, 
    SUM(CASE WHEN <cond>  THEN 1 ELSE 0 END) 
    SUM(CASE WHEN <other cond> THEN 1 ELSE 0 END) 
    . . . 

En cualquiera de los casos, que puede repetir muchas veces como necesites.

+1

Creo que sus expresiones 'CASE' son probablemente sintaxis inválida porque no hay' END'. –

+0

Creo que tiene razón, señor. Acabo de actualizar la sintaxis. Debe dejar de apresurarse. –

0

El ejemplo devuelve el recuento por usuario, por IssueType.

; 
with 
q_00 as (
select 
     is_issue_no 
    , is_assigned_user_id 
    , case 
      when is_issue_no between 1 and 10 then 'A' 
      when is_issue_no between 11 and 14 then 'B' 
      else 'C' 
     end as IssueType 
from Issues 
) 
select 
     us_logon_name 
    , IssueType 
    , count(1) as cnt 
from q_00 as a 
join users as u on a.is_assigned_user_id = u.us_user_id 
group by us_logon_name, IssueType 
order by us_logon_name, IssueType ; 

servidor SQL 2005 +

Cuestiones relacionadas