2011-11-03 25 views
14

Ho la seguente tabella:MYSQL query di selezione con SUM()

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

mi serve il seguente output:

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

So che devo utilizzare una sorta di SUM() in la mia query, ma non so come differire tra quei molteplici valori unici in source_id (qualcosa come foreach, idk).

Come posso ottenere questo output che mostra le statistiche di tutti gli unici source_id utilizzando una sola query?

risposta

19

Prova questo:

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

Non dovrei raggruppare per source_id? Altrimenti grazie, lo proverò! – DonCroce

+0

Si dovrebbe 'GROUP BY source_Id'. Penso anche che voglia 'SELECT source_id, SUM (cliccato) + SUM (visualizzato) come totale' –

+0

@DonCroce: sì, solo un refuso. Modificato il mio post :) – Marco

3

Ecco la vostra dati di esempio caricati in una tabella chiamata campagna:

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; 

Ecco cosa contiene

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) 

Ora, ecco un buona query che devi sommare e sommare per campagna + totale totale

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; 

Ecco l'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) 

Ora vestire in su con la funzione 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; 

Ecco che l'uscita

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) 

dargli una prova !! !

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