2017-04-01 45 views
0

我是SQL新手,尝试创建正在运行的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; 

在此先感谢。

回答

0

你想可以用一点点除了你的第一个SQL语句来完成的事情:group by条款之后添加with rollup

GROUP BY Datum WITH ROLLUP 

它将比子查询的版本更高效地运行,虽然它可以这样工作,但是您应该删除外部的group by子句,而不是在那里选择Datum,因为您的不需要希望每个日期的总计更多但总体。

尽管如此,您仍然会失去细节,只能得到总计。你将不得不使用你的原始查询的联合来获得两个总计水平。你可以想象with rollup修饰符会更有效地完成这项工作。

+0

非常感谢trincot! – z3us

+0

Graag gedaan ;-) – trincot