我是 SQL 新手,正在尝试创建有效 SQL 查询的总体摘要。它列出了一个月数据的总结果。 现在我需要查询结果的总值。 所以我创建了一个“查询中的查询”的 SQL 片段,但它不起作用,因为我缺乏 SQL 知识。我想这对专业人士来说是一个简单的修复:-)
工作 SQL 查询,一个月内每天的结果:
SELECT
DATE_FORMAT(date, '%d/%m/%y') AS Datum,
COUNT(*) AS Berichten,
SUM(CASE WHEN virusinfected>0 THEN 1 ELSE 0 END) AS Virus,
SUM(CASE WHEN (virusinfected=0 OR virusinfected IS NULL) AND isspam>0 THEN 1 ELSE 0 END) AS Ongewenst,
SUM(CASE WHEN (virusinfected=0 OR virusinfected IS NULL) AND (isspam=1) AND isrblspam>0 THEN 1 ELSE 0 END) AS RBL,
SUM(size) AS Grootte
FROM
maillog
WHERE
1=1
AND (1=1)
AND
date < '2017-04-01'
AND
date >= '2017-03-01'
AND
to_domain = 'domain1.nl'
OR
date < '2017-04-01'
AND
date >= '2017-03-01'
AND
to_domain = 'domain2.nl'
GROUP BY
Datum
ORDER BY
date
尝试创建每月总计的错误查询:
SELECT Datum,
SUM(Berichten) AS Berichten,
SUM(Virus) AS Virus,
SUM(Ongewenst) AS Ongewenst,
SUM(RBL) AS RBL,
SUM(Grootte) AS Grootte,
FROM ( SELECT
DATE_FORMAT(date, '%d/%m/%y') AS Datum,
COUNT(*) AS Berichten,
SUM(CASE WHEN virusinfected>0 THEN 1 ELSE 0 END) AS Virus,
SUM(CASE WHEN (virusinfected=0 OR virusinfected IS NULL) AND isspam>0 THEN 1 ELSE 0 END) AS Ongewenst,
SUM(CASE WHEN (virusinfected=0 OR virusinfected IS NULL) AND (isspam=1) AND isrblspam>0 THEN 1 ELSE 0 END) AS RBL,
SUM(size) AS Grootte
FROM
maillog
WHERE
1=1
AND (1=1)
AND
date < '2017-04-01'
AND
date >= '2017-03-01'
AND
to_domain = 'domain1.nl'
OR
date < '2017-04-01'
AND
date >= '2017-03-01'
AND
to_domain = 'domain2.nl'
GROUP BY
Datum
ORDER BY
date
) t
GROUP BY Datum;
提前致谢。
最佳答案
只需在第一个 SQL 语句中添加一点内容即可完成您想要的操作:add with rollup
在 group by
子句之后:
GROUP BY Datum WITH ROLLUP
它将比带有子查询的版本运行更高效,尽管它可以这样工作,但您应该删除外部 group by
子句,而不是选择 Datum
那里,因为您不再想要每个日期的总数,但总体而言。
不过,您仍然会丢失详细信息,而只能获得总体总数。您必须将原始查询与并集结合使用才能获得两个级别的总计。您可以想象 with rollup
修饰符会更有效地完成这项工作。
关于mysql - SQL查询总结问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43154934/