Search code examples
mysqlsqldatetime-generation

Get sum of fields


Possible Duplicate:
MySQL Count data for last 7 days

I have an issue where i need to show the sum of fields. Lets say I have a recordset as follows,

detectDate      |isp    |infection  | count
--------------------------------------
2012-10-02 01:00|aaaa   |malware    |3
2012-10-02 01:30|bbbb   |malware    |2
2012-10-02 01:33|bbbb   |spy-eye    |2
2012-10-02 01:45|aaaa   |DDos       |1
2012-10-03 01:50|cccc   |malware    |2
2012-10-03 02:00|dddd   |TDSS       |2
2012-10-03 04:50|dddd   |TDSS       |3

And i want to display an output which will show the sum of all the infections for each day as follows,

detectDate  |infection  | count
-------------------------------
2012-10-02  |DDos       |1
2012-10-02  |malware    |5
2012-10-02  |spy-eye    |2
2012-10-02  |TDSS       |0
2012-10-03  |DDos       |0
2012-10-03  |malware    |2
2012-10-03  |spy-eye    |0
2012-10-03  |TDSS       |5

I used this query,

SELECT DATE_FORMAT( detectDate, '%Y-%m-%d' ) AS detectDate, infection, SUM( count )
FROM `tbl_correlateddata`
GROUP BY DATE_FORMAT( detectDate, '%Y-%m-%d' ) , infection

but it only gives an out put as follows which is NOT my requirement..

detectDate  |infection  | count
-------------------------------
2012-10-02  |DDos       |1
2012-10-02  |malware    |5
2012-10-02  |spy-eye    |2
2012-10-03  |malware    |2
2012-10-03  |TDSS       |5

any help would be much helpful :) Thank you very much :) much appreciated :)

EDIT: Possible duplicate of : MySQL Count data for last 7 days

but not similar


Solution

  • SELECT e.*, COALESCE(SUM(d.`count`),0) `SUM of count`
    FROM
    (
      SELECT c.detectDate, a.infection
      FROM
        (
          SELECT  DISTINCT infection
          FROM    tbl_correlateddata
        ) a CROSS JOIN
        (
          SELECT  DISTINCT DATE(detectDate) detectDate 
          FROM    tbl_correlateddata 
        ) c
    ) e LEFT JOIN tbl_correlateddata d
        ON  DATE(d.detectDate) = e.detectDate AND
            d.infection = e.infection
     GROUP BY detectDate, infection
     ORDER BY e.detectDate, e.infection
    

    or

    SELECT  DATE_FORMAT(e.detectDate, '%Y-%m-%d' ), 
            e.infection, 
            COALESCE(SUM(d.`count`),0) `SUM of count`
    FROM
    (
      SELECT c.detectDate, a.infection
      FROM
        (
          SELECT  DISTINCT infection
          FROM    tbl_correlateddata
        ) a CROSS JOIN
        (
          SELECT  DISTINCT DATE(detectDate) detectDate 
          FROM    tbl_correlateddata 
        ) c
    ) e LEFT JOIN tbl_correlateddata d
        ON  DATE(d.detectDate) = e.detectDate AND
            d.infection = e.infection
     GROUP BY e.detectDate, e.infection
     ORDER BY e.detectDate, e.infection