2011-08-29 14 views
5

Tengo una tabla que almacena varios elementos para un estado y quiero obtener el recuento de todos los estados según las condiciones específicas. Escribí esta consulta:Caso y recuento en SQL Server 2008

SELECT 
    State_ID, 
    State_Name, 
    State_All= CASE WHEN type1=1 AND type2=1 THEN COUNT(Id) END 
    State_w= CASE WHEN type1=2 AND type2=1 THEN COUNT(Id) END 
    State_s= CASE WHEN type1=2 AND type2=2 THEN COUNT(Id) END 
FROM 
    tblStates 

pero me sale este error:

Column 'State_ID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 

Cuando añadí GROUP BY cláusula Para state_id, que tiene por encima de error de nuevo por STATE_NAME, y cuando se añade STATE_NAME a GROUP BY cláusula, me Obtuvo el error para State_All, State_w, State_s.

No tengo una columna llamada State_All, State_w, State_s en mi tabla.

¿Cómo puedo obtener el recuento según las condiciones específicas sin usar CURSORS?

Respuesta

0

Sería esto solucionarlo?

SELECT 
    State_ID, 
    State_Name, 
    CASE WHEN type1=1 AND type2=1 THEN COUNT(Id) END AS State_All, 
    CASE WHEN type1=2 AND type2=1 THEN COUNT(Id) END AS State_w, 
    CASE WHEN type1=2 AND type2=2 THEN COUNT(Id) END AS State_s 
FROM 
    tblStates 
GROUP BY State_ID, State_Name 
+0

Solo ha cambiado la forma en que las columnas son alias. OP ya ha intentado GRUPO POR – gbn

0

Usted debe agregar dos columnas en el final de su consulta:

GROUP BY State_ID, State_Name 
+0

me dijo cuando me agregue 'GROUP BY State_ID, State_Name' agian Obtuve el error para State_All, .... – Arian

+0

No estaba claro por tu pregunta, pensé que querías decir que probaste State_ID y luego probé State_Name en su lugar. –

11

Estaba en el camino correcto.

Pone la condición dentro del COUNT de esta manera. COUNT ignora NULLs (que es el ELSE implícito en el CASO) por lo que solo se cuentan las coincidencias verdaderas. También necesita GROUP BY.

Su error proviene de la utilización de tipo 1 y tipo 2 fuera de la cuenta

SELECT 
    State_ID, 
    State_Name, 
    State_All = COUNT(CASE WHEN type1=1 AND type2=1 THEN 1 END), 
    State_w = COUNT(CASE WHEN type1=2 AND type2=1 THEN 1 END), 
    State_s = COUNT(CASE WHEN type1=2 AND type2=2 THEN 1 END) 
FROM 
    tblStates 
GROUP BY 
    State_ID, State_Name 
+0

Gran trabajo que es correcto mi camino sería un error. Tenga en cuenta que si type1 = 1 y type2 = 2 también :) – JTWebMan

3

Puede cambiar Conde a SUMA, ya que cada resultado récord 1

SELECT 
    State_ID, 
    State_Name, 
    State_All = SUM(CASE WHEN type1=1 AND type2=1 THEN 1 END), 
    State_w = SUM(CASE WHEN type1=2 AND type2=1 THEN 1 END), 
    State_s = SUM(CASE WHEN type1=2 AND type2=2 THEN 1 END) 
FROM 
    tblStates 
GROUP BY 
    State_ID, State_Name