2017-04-01 50 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