Estoy tratando de hacer el recuento de valores distintos, basado en múltiples criterios.
Datos de ejemplo de ejercicio incluido a continuación.

 Tabla1 
╔════════╦════════╦══════╗ 
║ ID del error ║ Estado ║ Prueba ║ 
╠════════╬════════╬══════╣ 
║ 1 ║ Abrir ║ w ║ 
║ 2 ║ Cerrado ║ w ║ 
║ 3 ║ Abrir ║ w ║ 
║ 4 ║ Abrir ║ x ║ 
║ 4 ║ Abrir ║ x ║ 
║ 5 ║ Cerrado ║ x ║ 
║ 5 ║ Cerrado ║ x ║ 
║ 5 ║ Cerrado ║ y ║ 
║ 6 ║ Abrir ║ z ║ 
║ 6 ║ Abrir ║ z ║ 
║ 6 ║ Abrir ║ z ║ 
║ 7 ║ Cerrado ║ z ║ 
║ 8 ║ Cerrado ║ z ║ 
╚════════╩════════╩══════╝ 
Deseado De Los Resultados De La Consulta 
╔══════╦═══════════╦════════════╗ 
║ Prueba ║ Bugs Abiertos ║ Total De Errores ║ 
╠══════╬═══════════╬════════════╣ 
º w º 2 º 3 º 
║ x ║ 1 ║ 2 ║ 
║ y ║ 0 ║ 1 ║ 
║ z ║ 1 ║ 3 ║ 
╚══════╩═══════════╩════════════╝ 

Un determinado Error puede ser encontrado en varias Pruebas, varias veces para la misma Prueba(ex: 6), o ambos (ej: 5).

La siguiente consulta funciona bien para entregar con precisión Total de Errores’

SELECT
Test,
COUNT(DISTINCT Bug ID) AS "Total Bugs"
FROM
Table1
GROUP BY Test

Mi investigación me ha llevado a variaciones en la siguiente consulta. Se olvida de los distintos errores y, por tanto, devolver resultados incorrectos (se muestra a continuación la consulta) para los ‘Bugs Abiertos’ columna

SELECT
Test,
SUM(CASE WHEN Status <> 'Closed' THEN 1 ELSE 0 END) AS "Open Bugs"
FROM
Table1
GROUP BY Test
╔══════╦═══════════╗ 
║ Prueba ║ Bugs Abiertos ║ 
╠══════╬═══════════╣ 
║ w ║ 2 ║ 
║ x ║ 2 ║ 
║ y ║ 0 ║ 
║ z ║ 3 ║ 
╚══════╩═══════════╝ 

De curso de mi resultado final debe entregar tanto el recuento de columnas en una tabla (en lugar de utilizar consultas independientes como yo he hecho con fines de demostración).

Me gustaría no depender de varias subconsultas porque mi vivir ejemplo se tienen más de dos columnas con los recuentos en la misma mesa, pero varios criterios.

Estoy trabajando con SQL Server (no estoy seguro de liberación).

Cualquier ayuda es muy apreciada.

OriginalEl autor Blake | 2013-04-22

1 Comentario

  1. 18

    Usted puede tener un condicional count(distinct) mediante este código:

    SELECT Test, COUNT(DISTINCT "Bug ID") AS "Total Bugs",
    count(distinct (CASE WHEN "Status" <> 'Closed' THEN "Bug ID" END)) as "Open Bugs"
    FROM Table1
    GROUP BY Test

    La case declaración comprueba la condición. Cuando es true, devuelve el Bug ID. Cuando no se presente, su valor predeterminado es NULL, por lo que el id no se cuentan en las estadísticas.

    Extremadamente útil. Yo no era consciente de que podría hacer referencia a las columnas después de que el ‘ENTONCES’. Gracias!

    OriginalEl autor Gordon Linoff

Dejar respuesta

Please enter your comment!
Please enter your name here