2011-11-03 16 views
14

mam poniższej tabeli:MYSQL kwerendę wybierającą z 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  | 

muszę następujący wynik:

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

wiem, że muszę użyć jakiegoś SUM() w moje zapytanie, ale nie wiem, jak odróżnić te wiele unikalnych wartości w source_id (coś takiego jak foreach, idk).

Jak uzyskać takie dane wyjściowe, które pokazują statystyki ze wszystkich unikalnych identyfikatorów źródła za pomocą tylko jednego zapytania?

Odpowiedz

19

Spróbuj tego:

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

Czy nie powinienem chcieć grupować według adresu źródłowego? W przeciwnym razie, wypróbuję to! – DonCroce

+0

Powinieneś "GROUP BY source_Id'. Też myślę, że on chce 'SELECT source_id, SUMA (kliknięty) + SUMA (obejrzany) jako Total' –

+0

@DonCroce: tak, tylko literówka. Zmieniono mój wpis :) – Marco

3

tutaj jest przykładowe dane załadowane do tabeli o nazwie kampanii:

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; 

Oto co zawiera

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) 

Teraz tutaj jest dobre zapytanie, które musisz sumować i sumować według kampanii + suma całkowita

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; 

Oto wynik:

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) 

Teraz ubierać go z funkcji 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; 

Oto że wyświetlamy

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) 

spróbować !! !

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