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