2015-06-23 52 views
-2

如果任何这些列没有返回值,试着返回0,在我的特殊情况下,'Past Due'没有总值,所以它被返回,所以我在这里获得第二个片段的回报。如果这些数值没有数值,我该如何返回?当总和没有值时返回0总和 - sql server

SELECT ClientDeliveryStatus, 
    SUM(CASE 
     WHEN ClientDeliveryStatus = 'Past Due' THEN 1 
     WHEN ClientDeliveryStatus = 'Due Tomorrow' THEN 1 
     WHEN ClientDeliveryStatus = 'Due Today' THEN 1 
     WHEN ClientDeliveryStatus = 'Due Beyond' THEN 1 
     ELSE 0 END) AS Total 
FROM Table1 
GROUP BY ClientDeliveryStatus 

当前结果:

ClientDeliveryStatus Total 
    Due Beyond    1 
    Due Today    3 
    Due Tomorrow   51 

所需的结果:

ClientDeliveryStatus Total 
    Due Beyond    1 
    Due Today    3 
    Due Tomorrow   51 
    Past Due    0 

实施例的数据:

TABLE1:

ClientDeliveryStatus 
Due Tomorrow 
Due Tomorrow 
Due Tomorrow 
Due Beyond 
Due Beyond 
Due Tomorrow 
Due Beyond 
Due Beyond 
Due Beyond 
Due Today 
Due Today 

CREATE TABLE1 Table1 (ClientDeliveryStatus VARCHAR(MAX)) 
INSERT INTO Table1 Values ('Due Tomorrow'), ('Due Tomorrow'), ('Due Tomorrow'), ('Due Beyond'), ('Due Beyond'), ('Due Beyond'), ('Due Beyond'), ('Due Today'),('Due Today') 

回答

3

您需要一个包含所有状态的表格。如果你不已经有一个表,你可以在查询本身做到这一点:

SELECT ClientDeliveryStatus, COUNT(t.ClientDeliveryStatus) AS Total 
FROM (SELECT 'Past Due' as cds UNION ALL 
     SELECT 'Due Tomorrow' UNION ALL 
     SELECT 'Due Today' UNION ALL 
     SELECT 'Due Beyond' 
    ) s LEFT JOIN 
    Table t 
    ON s.cds = t.ClientDeliveryStatus 
GROUP BY s.cds; 

你原来的查询不正确,因为它缺少一个GROUP BY和过于复杂,因为在SUM()CASE的。

+0

group by by,其存在于实际查询中,所以没有问题。工会会更简单还是更慢?我总是这样认为性能是一个因素,但是对于我来说,这比平均查询更重要。 – wondergoat77

+0

没有关于工会,愚蠢的问题 – wondergoat77

+0

@ wondergoat77。 。 。如果你有一个参考表的值,我不会感到惊讶。这将是最好的方法。 'UNION ALL'比'UNION'快。 –