¿Cómo incluyo registros en una consulta de Resumen para incluir aquell

¿Cómo incluyo registros en una consulta de Resumen para incluir aquellos que no tienen datos?

Tengo una consulta en una tabla de transacciones que devuelve el total resumido en una columna para cada ID según un rango de datos. La consulta funciona muy bien, excepto que no incluye las ID que no tienen datos en la tabla de transacciones. ¿Cómo puedo incluir esas identificaciones en mi resultado con un total de cero? Aquí hay una versión simplificada de mi consulta.

SELECT tblID.IDName
    ,SUM(CASE 
            WHEN tblTransactions.idxTransType = 30
                THEN CAST(tblTransactions.TimeAmount AS FLOAT) / 60.0
            ELSE 0
            END) AS 'Vacation'
FROM tblTransactions
INNER JOIN tblTransTypes ON tblTransactions.idxTransType = tblTransTypes.IdxTransType
INNER JOIN tblID ON tblTransactions.idxID = tblID.IdxID
WHERE (tblTransactions.Deleted = 0)
    AND (tblTransactions.NotCurrent = 0)
    AND (tblTransactions.TransDate >= CONVERT(DATETIME, 'March 1, 2018', 102))
    AND (tblTransactions.TransDate <= CONVERT(DATETIME, 'April 11, 2018', 102))
GROUP BY tblID.IDName
Mostrar la mejor respuesta

¿Cambiar INNER JOIN a LEFT JOIN?

Desafortunadamente, LEFT JOIN no funciona. Creo que se debe a que se trata de datos resumidos en la tabla Transacción y no puede incluir datos que no existen.

Quieres left joins:

SELECT i.IDName, 
       SUM(CASE WHEN t.idxTransType = 30 THEN CAST(t.TimeAmount AS Float) / 60.0 ELSE 0 END) AS Vacation
FROM tblID i LEFT JOIN
     tblTransactions t
     ON t.idxID = i.IdxID AND
        t.Deleted = 0 AND 
        t.NotCurrent = 0 AND
        t.TransDate >= '2018-03-01' AND
        t.TransDate <= '2018-04-11'
     tblTransTypes tt
     ON t.idxTransType = tt.IdxTransType 
GROUP BY i.IDName;

Notas:

  • Los alias de tabla hacen que la consulta sea mucho más fácil de escribir y leer.
  • Utilice formatos de fecha estándar ISO/ANSI.
  • Las condiciones de filtro en todas las tablas menos la primera pertenecen a las cláusulas ON.

En realidad, es un poco más complicado que eso:

SELECT        
    i.IDName, 
    SUM(CASE WHEN t.idxTransType = 30 THEN CAST(t.TimeAmount AS FLOAT) / 60.0 ELSE 0 END) AS 'Vacation'
FROM
    tblID i
    LEFT JOIN tblTransactions t ON t.idxID = i.IdxID AND t.Deleted = 0 AND t.NotCurrent = 0 AND t.TransDate BETWEEN '20180301' AND '20180411'
    LEFT JOIN tblTransTypes tt ON tt.IdxTransType = t.idxTransType
GROUP BY 
    i.IDName;

Eso es mejor, aunque tblTransTypes nunca se usa en la consulta, por lo que también puede eliminar esa línea.