2011-11-03 189 views
14

我有如下表:用SUM()MYSQL選擇查詢

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

我需要以下的輸出:

xxx > Total: 3 // Clicked: 2 // Viewed 1 
yyy > Total: 4 // Clicked: 2 // Viewed 1 

我知道,我必須使用某種SUM()的我的查詢,但我不知道如何區分source_id中的這些多個唯一值(如foreach,idk)。

如何通過只使用一個查詢來獲得顯示來自所有唯一source_id的統計信息的輸出?

回答

19

試試這個:

SELECT source_id, (SUM(clicked)+SUM(viewed)) AS Total 
FROM your_table 
GROUP BY source_id 
+0

難道我不想通過source_id進行分組嗎?否則,謝謝,我會試試這個! – DonCroce

+0

你應該'GROUP BY source_Id'。我也認爲他希望'SELECT source_id,SUM(點擊)+ SUM(查看)作爲Total' –

+0

@DonCroce:是的,只是一個錯字。編輯我的帖子:) – Marco

3

這裏被裝載到一個表的樣本數據稱爲運動:

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; 

下面是它包含

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) 

現在,這裏是一個好的查詢你需要總計和總計+總計

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; 

這裏是輸出:

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) 

現在用CONCAT功能

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; 

這裏打扮起來就是輸出

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) 

試試看! !

1
SELECT source_id, SUM(clicked + viewed) AS 'Total' 
FROM your_table 
GROUP BY source_id