2011-11-03 4 views
14

je le tableau suivant:MYSQL Sélectionnez requête avec SOMME()

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

J'ai besoin la sortie suivante:

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

Je sais que je dois utiliser une sorte de SUM() dans ma requête, mais je ne sais pas comment faire la différence entre ces multiples valeurs uniques dans le source_id (quelque chose comme foreach, idk).

Comment puis-je obtenir une telle sortie qui affiche les statistiques de toutes les sources_ids uniques en utilisant une seule requête?

Répondre

19

Essayez ceci:

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

Est-ce que je ne devrais pas regrouper par ID_source? Sinon merci, je vais essayer ça! – DonCroce

+0

Vous devriez 'GROUP BY source_Id'. Je pense aussi qu'il veut 'SELECT source_id, SUM (cliqué) + SUM (vu) comme Total' –

+0

@DonCroce: oui, juste une faute de frappe. Édité mon post :) – Marco

3

Voici vos données d'échantillon chargé dans une table appelée campagne:

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; 

Voici ce qu'il contient

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) 

Maintenant, voici un bonne requête, vous devez totaliser et additionner par campagne + 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; 

Voici la sortie:

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) 

habiller Maintenant avec la fonction 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; 

est ici que la production

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) 

Lui donner un essai !! !

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