【问题标题】:SQL - 2 Counts in one querySQL - 一次查询中有 2 个计数
【发布时间】:2011-05-19 02:26:04
【问题描述】:

我有 2 个查询返回表中不同信息的计数:

SELECT Date, COUNT(*) AS Total 
FROM Table
WHERE Type = 7 AND Date >= '2010-01-01' 
GROUP BY Date 
HAVING COUNT(*) > 5000  
ORDER BY Date

返回所有“忙碌”日期的总数:

Date       Total
---------- -----------
2010-01-05 9466
2010-02-02 8747
2010-03-02 9010
2010-04-06 7916
2010-05-05 9342
2010-06-02 8723
2010-07-02 7829
2010-08-03 8411
2010-09-02 7687
2010-10-04 7706
2010-11-02 8567
2010-12-02 7645

SELECT Date, COUNT(*) AS Failures
FROM Table
WHERE Type = 7 AND ErrorCode = -2 AND Date >= '2010-01-01' 
GROUP BY Date 
ORDER BY Date

返回总失败次数(所有这些都发生在繁忙的日期):

Date       Failures
---------- -----------
2010-09-02 29
2010-10-04 16
2010-11-02 8

是否可以将这些组合成一个查询以返回一个结果?

例如:

Date       Total       Failures
---------- ----------- -----------
2010-01-05 9466
2010-02-02 8747
2010-03-02 9010
2010-04-06 7916
2010-05-05 9342
2010-06-02 8723
2010-07-02 7829
2010-08-03 8411
2010-09-02 7687         29
2010-10-04 7706         16
2010-11-02 8567         8
2010-12-02 7645

【问题讨论】:

    标签: sql-server tsql count group-by


    【解决方案1】:
    ;With baseData As
    (
    SELECT 
          Date, 
          COUNT(*) AS Total, 
          COUNT(CASE WHEN ErrorCode = -2 THEN 1 END)  AS Failures
    FROM Table
    WHERE Type = 7 AND Date >= '2010-01-01' 
    GROUP BY Date 
    )
    SELECT 
         Date,
         Total,
         Failures, 
         CAST(Failures AS float)/Total AS Ratio
    FROM baseData
    WHERE Total > 5000  OR Failures > 0
    ORDER BY Date
    

    【讨论】:

    • 太棒了,谢谢!我确实收到了警告:Null value is eliminated by an aggregate or other SET operation.,但结果正是我想要的。
    • 现在我需要的是第四列,它显示了失败的百分比:)
    • @Shevek - 您可以只使用CAST(COUNT(CASE WHEN ErrorCode = -2 THEN 1 END) AS float)/COUNT(*),但现在可能更容易将其粘贴到 CTE 中,只要您至少使用 SQL Server 2005。请参阅我的编辑。
    • 演员在 200 岁时效果很好……如果我能给你 +2 我会的!
    【解决方案2】:

    如果你可以重构到相同的 where 子句,这应该是可能的。

    我没有考虑你的 HAVING(Count())

    SELECT [Date], COUNT(*) AS Total, SUM(CASE WHEN ErrorCode = -2 THEN 1 ELSE 0 END) AS Failures 
    FROM [Table]
    WHERE [Type] = 7  AND [Date] >= '2010-01-01'  
    GROUP BY [Date]  
    ORDER BY [Date] 
    

    编辑:这是一些测试数据

    create table [Table]
    (
    [ErrorCode] int,
    [Type] int,
    [Date] datetime
    )
    
    insert into [table]([Date], [Type], [ErrorCode] )values ('1 Jan 2010', 7, 0)
    insert into [table]([Date], [Type], [ErrorCode] )values ('1 Jan 2010', 7, -2)
    insert into [table]([Date], [Type], [ErrorCode] )values ('2 Jan 2010', 7, -2)
    insert into [table]([Date], [Type], [ErrorCode] )values ('2 Jan 2010', 8, -2)
    insert into [table]([Date], [Type], [ErrorCode] )values ('2 Jan 2010', 7, 1)
    

    【讨论】:

    • Martin 的解决方案比我的更完整 - COUNT(CASE WHEN ErrorCode = -2 THEN 1 END) 也比我的 SUM 更优雅。请注意, COUNT(0) 是 1,但是当 Martin 不包括其他情况时,他是正确的)
    【解决方案3】:

    是的,您应该能够在 2 个表之间执行 UNION ALL

    【讨论】:

    • 只返回 15 行 2 列
    猜你喜欢
    • 1970-01-01
    • 2021-07-17
    • 2016-06-11
    • 2020-12-15
    • 2012-06-02
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多