mysql - SQL查询总结问题

标签 mysql group-by sum

我是 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 rollupgroup by 子句之后:

GROUP BY Datum WITH ROLLUP

它将比带有子查询的版本运行更高效,尽管它可以这样工作,但您应该删除外部 group by 子句,而不是选择 Datum 那里,因为您不再想要每个日期的总数,但总体而言。

不过,您仍然会丢失详细信息,而只能获得总体总数。您必须将原始查询与并集结合使用才能获得两个级别的总计。您可以想象 with rollup 修饰符会更有效地完成这项工作。

关于mysql - SQL查询总结问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43154934/

相关文章:

mysql - SQL查询查找具有最大里程的汽车

javascript - 使用javascript在字符串中添加单个数字的最简单方法是什么

mysql - 指定 OUTFILE 路径

mysql - 在多个表中放置唯一索引

mysql - 选择包含航行补丁更改日期的唯一记录

mysql - 使用多个联接格式化 RIGHT JOIN 查询

sqlite - 如何在 SQLite 中添加总列

mysql - 使用电子邮件输入数据库

mysql - 获取两个表之间的匹配行,否则在左表中获取 NULL

python - 使用不按字母顺序排列的 pandas.Dataframe.groupby