I have the following table:
| campaign_id | source_id | clicked | viewed | ---------------------------------------------- | abc | xxx | 0 | 0 | | abc | xxx | 1 | 0 | | abc | xxx | 1 | 1 | | abc | yyy | 0 | 0 | | abc | yyy | 1 | 0 | | abc | yyy | 1 | 1 | | abc | yyy | 0 | 0 |
I need the following output:
xxx > Total: 3 // Clicked: 2 // Viewed 1 yyy > Total: 4 // Clicked: 2 // Viewed 1
I know that I have to use some sort of SUM() in my query, but I don't know how to differ between those multiple unique values in the source_id (something like foreach, idk).
How can I get such an output which shows stats from all unique source_ids by using only one query?
Example: MySQL SUM() function using multiple columnsMySQL SUM() function retrieves the sum value of an expression which is made up of more than one columns. The above MySQL statement returns the sum of multiplication of 'receive_qty' and 'purch_price' from purchase table for each group of category ('cate_id') .
like this $sum= mysql_query("SELECT SUM(Value) FROM Codes"); with this i get Resource id #10 but not the sum of all values. Try $result = mysql_query('SELECT SUM(value) AS value_sum FROM codes'); $row = mysql_fetch_assoc($result); $sum = $row['value_sum']; .
Try this:
SELECT source_id, (SUM(clicked)+SUM(viewed)) AS Total FROM your_table GROUP BY source_id
Here is your sample data loaded into a table called campaign:
CREATE TABLE campaign ( campaign_id VARCHAR(10), source_id VARCHAR(10), clicked int, viewed int ); INSERT INTO campaign VALUES ('abc','xxx',0,0), ('abc','xxx',1,0), ('abc','xxx',1,1), ('abc','yyy',0,0), ('abc','yyy',1,0), ('abc','yyy',1,1), ('abc','yyy',0,0); SELECT * FROM campaign;
Here is what it contains
mysql> DROP TABLE IF EXISTS campaign; CREATE TABLE campaign ( campaign_id VARCHAR(10), source_id VARCHAR(10), clicked int, viewed int ); INSERT INTO campaign VALUES ('abc','xxx',0,0), ('abc','xxx',1,0), ('abc','xxx',1,1), ('abc','yyy',0,0), ('abc','yyy',1,0), ('abc','yyy',1,1), ('abc','yyy',0,0); SELECT * FROM campaign; Query OK, 0 rows affected (0.03 sec) mysql> CREATE TABLE campaign -> ( -> campaign_id VARCHAR(10), -> source_id VARCHAR(10), -> clicked int, -> viewed int -> ); Query OK, 0 rows affected (0.08 sec) mysql> INSERT INTO campaign VALUES -> ('abc','xxx',0,0), -> ('abc','xxx',1,0), -> ('abc','xxx',1,1), -> ('abc','yyy',0,0), -> ('abc','yyy',1,0), -> ('abc','yyy',1,1), -> ('abc','yyy',0,0); Query OK, 7 rows affected (0.07 sec) Records: 7 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM campaign; +-------------+-----------+---------+--------+ | campaign_id | source_id | clicked | viewed | +-------------+-----------+---------+--------+ | abc | xxx | 0 | 0 | | abc | xxx | 1 | 0 | | abc | xxx | 1 | 1 | | abc | yyy | 0 | 0 | | abc | yyy | 1 | 0 | | abc | yyy | 1 | 1 | | abc | yyy | 0 | 0 | +-------------+-----------+---------+--------+ 7 rows in set (0.00 sec)
Now, here is a good query you need to total and sum by campaign + grand total
SELECT campaign_id, source_id, count(source_id) total, SUM(clicked) sum_clicked, SUM(viewed) sum_viewed FROM campaign GROUP BY campaign_id,source_id WITH ROLLUP;
Here is the output:
mysql> SELECT -> campaign_id, -> source_id, -> count(source_id) total, -> SUM(clicked) sum_clicked, -> SUM(viewed) sum_viewed -> FROM campaign -> GROUP BY campaign_id,source_id -> WITH ROLLUP; +-------------+-----------+-------+-------------+------------+ | campaign_id | source_id | total | sum_clicked | sum_viewed | +-------------+-----------+-------+-------------+------------+ | abc | xxx | 3 | 2 | 1 | | abc | yyy | 4 | 2 | 1 | | abc | NULL | 7 | 4 | 2 | | NULL | NULL | 7 | 4 | 2 | +-------------+-----------+-------+-------------+------------+ 4 rows in set (0.00 sec)
Now dress it up with the CONCAT function
SELECT CONCAT( 'Campaign ',campaign_id, ' Source ',source_id, ' > Total: ', total, ' // Clicked: ', sum_clicked ,' // Viewed: ', sum_viewed) "Campaign Report" FROM (SELECT campaign_id, source_id, count(source_id) total, SUM(clicked) sum_clicked, SUM(viewed) sum_viewed FROM campaign GROUP BY campaign_id,source_id) A;
Here is that output
mysql> SELECT -> CONCAT( -> 'Campaign ',campaign_id, -> ' Source ',source_id, -> ' > Total: ', -> total, -> ' // Clicked: ', -> sum_clicked -> ,' // Viewed: ', -> sum_viewed) "Campaign Report" -> FROM -> (SELECT -> campaign_id, -> source_id, -> count(source_id) total, -> SUM(clicked) sum_clicked, -> SUM(viewed) sum_viewed -> FROM campaign -> GROUP BY -> campaign_id,source_id) A; +---------------------------------------------------------------+ | Campaign Report | +---------------------------------------------------------------+ | Campaign abc Source xxx > Total: 3 // Clicked: 2 // Viewed: 1 | | Campaign abc Source yyy > Total: 4 // Clicked: 2 // Viewed: 1 | +---------------------------------------------------------------+ 2 rows in set (0.00 sec)
Give it a Try !!!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With