Sql 在单个查询中使用多个计数
我在下面有一个查询,我想返回一天的关键和警告警报总数,但我的问题是,当我在一定的天数范围内执行此操作时,它会添加指定日期的关键警报Sql 在单个查询中使用多个计数,sql,sql-server,Sql,Sql Server,我在下面有一个查询,我想返回一天的关键和警告警报总数,但我的问题是,当我在一定的天数范围内执行此操作时,它会添加指定日期的关键警报 SELECT alertDate as "Alert Date", (SELECT COUNT(alertType) FROM alerts WHERE alertDate BETWEEN '2016/02/15' AND '2016/02/16' AND UPPER(alertType)='CRITICAL') as Critical, (SELE
SELECT alertDate as "Alert Date",
(SELECT COUNT(alertType) FROM alerts WHERE alertDate BETWEEN '2016/02/15' AND '2016/02/16' AND UPPER(alertType)='CRITICAL') as Critical,
(SELECT COUNT(alertType) FROM alerts WHERE alertDate BETWEEN '2016/02/15' AND '2016/02/16' AND UPPER(alertType)='WARNING') as Warning
FROM alerts
where alertDate BETWEEN '2016/02/15' AND '2016/02/16'
GROUP BY alertDate;
尝试了上面的代码,但显然我无法在子查询中添加“group by”子句,我认为这就是问题所在,请提供有关如何进行此操作的帮助…您可以使用sum(case)来实现此目的:
SELECT alertDate as "Alert Date",
sum(case when UPPER(alertType)='CRITICAL' then 1 end) as Critical,
sum(case when UPPER(alertType)='WARNING' then 1 end) as Warning
FROM alerts
where alertDate BETWEEN '2016/02/15' AND '2016/02/16'
GROUP BY alertDate;
您可以使用sum(case)进行以下操作:
SELECT alertDate as "Alert Date",
sum(case when UPPER(alertType)='CRITICAL' then 1 end) as Critical,
sum(case when UPPER(alertType)='WARNING' then 1 end) as Warning
FROM alerts
where alertDate BETWEEN '2016/02/15' AND '2016/02/16'
GROUP BY alertDate;
您需要条件聚合--
案例
位于聚合函数内部。我将这样写:
SELECT alertDate as AlertDate,
SUM(CASE WHEN UPPER(alertType) = 'CRITICAL' THEN 1 ELSE 0 END) as Critical,
SUM(CASE WHEN UPPER(alertType) = 'WARNING' THEN 1 ELSE 0 END) as WARNING
FROM alerts a
WHERE alertDate BETWEEN '2016-02-15' AND '2016-02-16'
GROUP BY alertDate;
如果您使用的是MySQL,您可以将其短接到:
SELECT alertDate as AlertDate,
SUM(UPPER(alertType) = 'CRITICAL') as Critical,
SUM(UPPER(alertType) = 'WARNING') as Warning
FROM alerts a
WHERE alertDate BETWEEN '2016-02-15' AND '2016-02-16'
GROUP BY alertDate;
请注意其他几个变化:
- 不需要子选择
- 我删除了
中的空格。我只是不喜欢需要转义的列别名AlertDate
- 我将日期文本中的
替换为/
——连字符与ISO 8601兼容-
大小写在聚合函数中。我将这样写:
SELECT alertDate as AlertDate,
SUM(CASE WHEN UPPER(alertType) = 'CRITICAL' THEN 1 ELSE 0 END) as Critical,
SUM(CASE WHEN UPPER(alertType) = 'WARNING' THEN 1 ELSE 0 END) as WARNING
FROM alerts a
WHERE alertDate BETWEEN '2016-02-15' AND '2016-02-16'
GROUP BY alertDate;
如果您使用的是MySQL,您可以将其短接到:
SELECT alertDate as AlertDate,
SUM(UPPER(alertType) = 'CRITICAL') as Critical,
SUM(UPPER(alertType) = 'WARNING') as Warning
FROM alerts a
WHERE alertDate BETWEEN '2016-02-15' AND '2016-02-16'
GROUP BY alertDate;
请注意其他几个变化:
- 不需要子选择
- 我删除了
AlertDate
中的空格。我只是不喜欢需要转义的列别名
- 我将日期文本中的
/
替换为-
——连字符与ISO 8601兼容
您可能应该使用如下条件计数
SUM( case when alertDate BETWEEN '2016/02/15' AND '2016/02/16'
AND UPPER(alertType)='CRITICAL' then 1 else 0 end) as Critical,
您可能应该使用条件计数,如
SUM( case when alertDate BETWEEN '2016/02/15' AND '2016/02/16'
AND UPPER(alertType)='CRITICAL' then 1 else 0 end) as Critical,
您能否提供一些您的查询没有解决的预期结果?您可以选择MySQL或SQL Server吗?它们都非常不同…我删除了不兼容的数据库标记。请用您真正使用的数据库进行标记。很抱歉,我使用的是SQLServer。您能否向我们提供一些您的查询未解决的预期结果?您能否选择MySQL或SQL Server?它们都非常不同…我删除了不兼容的数据库标记。请使用您真正使用的数据库进行标记。对不起,我使用的是sqlserver