Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MYSQL Select Query with SUM()

Tags:

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?

like image 739
DonCroce Avatar asked Nov 03 '11 18:11

DonCroce


People also ask

How do you sum two columns in MySQL?

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') .

How can I get column sum in MySQL using PHP?

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']; .


2 Answers

Try this:

SELECT source_id, (SUM(clicked)+SUM(viewed)) AS Total FROM your_table GROUP BY source_id 
like image 68
Marco Avatar answered Oct 10 '22 08:10

Marco


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 !!!

like image 23
RolandoMySQLDBA Avatar answered Oct 10 '22 07:10

RolandoMySQLDBA