2017-04-01 5 views
0

私はSQLを初めて使い、動作中のSQLクエリの要約を作成しようとしています。 1か月のデータから得られた合計結果をリストしています。 これで、クエリの結果の合計値が必要になりました。 私は 'クエリのクエリ'の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; 
私はそれはあなたのためのプロの:-)

1ヶ月の毎日の成果と作業SQLクエリ簡単修正だと思います

ありがとうございます。

答えて

0

何あなたが最初のSQLステートメントに少しだけ追加して行うことができますしたい:group by句の後with rollupを追加します。

GROUP BY Datum WITH ROLLUP 

それはサブクエリとのバージョンよりも効率的に実行され、それが、そのように動作する可能性がありますが、外側のgroup by句を削除し、そこにDatumを選択しないようにしてください。ではなく、全体的に日付が必要です。

しかし、あなたは詳細を失い、総計のみを取得します。両方のレベルの合計を取得するには、元のクエリでユニオンを使用する必要があります。 with rollup修飾子がジョブをより効率的に処理すると想像することができます。

+0

ありがとうたくさんのトリコット! – z3us

+0

Graag gedaan ;-) – trincot