2017-08-29 80 views
0

我有兩個表;SQL:根據相關表的條件計數和求和

countries(id,name,region);

1, 'UK', '1'; 
2, 'USA', '1'; 
3, 'AUSTRALIA', '1'; 
4, 'CHINA', '0'; 
5, 'INDIA', '0'; 
6, 'SRI LANKA', '0' ; 

車票(ID,COUNTRY_ID,issued_date,保持器,性別,費,取消);

100, 2, 2017-08-15, 'Person 1', 'M', 200, '1'; 
101, 2, 2017-08-15, 'Person 2', 'M', 200, '0'; 
103, 3, 2017-08-15, 'Person 3', 'M', 200, '0'; 
104, 5, 2017-08-16, 'Person 1', 'M', 200, '0'; 
105, 6, 2017-08-16, 'Person 1', 'M', 200, '0'; 
106, 1, 2017-08-17, 'Person 1', 'M', 200, '0'; 
107, 3, 2017-08-18, 'Person 1', 'M', 200, '1'; 
108, 4, 2017-08-18, 'Person 1', 'M', 200, '0'; 

我想組基於issued_date一些聚集域生成彙總的所有門票。這裏是我的查詢: -

SELECT 

issued_date, 
COUNT(*) as total_tickets, 
COUNT(CASE WHEN canceled = '0' THEN 1 ELSE NULL END) as issued_tickets, 
SUM(CASE WHEN canceled = '0' THEN fee ELSE NULL END) as total_amount 

FROM tickets 

GROUP BY issued_date; 

但是,如何將COUNT和SUM用於相關表的國家?例如,我想要顯示從某個地區='1'的國家/地區的某個日期(2017-08-15)銷售了多少張門票。

我嘗試以下,但結果是不正確的region_1場

SELECT 

issued_date, 
COUNT(*) as total_tickets, 
COUNT(CASE WHEN canceled = '0' THEN 1 ELSE NULL END) as issued_tickets,SUM(CASE WHEN canceled = '0' THEN fee ELSE NULL END) as total_amount, 
(SELECT COUNT(countries.id) FROM countries WHERE countries.id = tickets.country_id && countries.region = '1') as region_1 

FROM tickets 

GROUP BY issued_date; 

回答

0

我會使用上ISSUE_DATE,COUNTRY_ID和地區,使用在內部派生表分組派生表。

SELECT issued_date 
    ,COUNT(*) AS total_tickets 
    ,COUNT(CASE WHEN canceled = '0' THEN 1 ELSE NULL END) AS issued_tickets 
    ,SUM(CASE WHEN canceled = '0' THEN fee ELSE NULL END) AS total_amount 
    ,tickets_by_region.total_region_1_tickets 
FROM tickets 
INNER JOIN (
    SELECT issued_date 
     ,country_id 
     ,countries.region 
     ,COUNT(*) AS total_region_1_tickets 
    FROM tickets 
    INNER JOIN countries ON (countries.id = tickets.country_id) 
    GROUP BY issued_date 
     ,countries.country_id 
     ,countries.region 
    ) tickets_by_region ON (
     tickets_by_region.issued_date = tickets.issued_date 
     AND tickets_by_region.country_id = tickets.country_id 
     AND tickets_by_region.region = '1' 
     ) AS region_1 
GROUP BY issued_date; 

HTH。

0

您可能需要使用INNER JOINGROUP BY with HAVING,它們允許在相關鍵上附加下一個表並添加到其他摘要或計數中,因爲它們需要使用子查詢,因爲它們需要使用沒有過濾的數據。

做法是準備在子查詢數據,然後加入到過濾的數據 到您的主表,可以爲最終結果做最後的篩選。

SQL罐看起來像波紋管(上本地測試)

SELECT t1.issued_date, COUNT(t1.id) as sum_tickets, t2.region, t3.total_tickets 
FROM tickets t1 
LEFT JOIN (SELECT id, COUNT(id) as total_tickets FROM tickets) t3 ON t3.id = t1.id 
INNER JOIN countries t2 ON t2.id = t1.country_id 
GROUP BY t1.issued_date 
HAVING (t2.region = '1') 


輸出是

issued_date,sum_tickets,區域,total_tickets
2017年8月15日,    3,                 1,          2017年8月17日,    1,                1,           空
2017年8月18日,    2,                1,           空

您可以添加多個條件查詢HAVING。

0

我只想用條件聚集了JOIN

SELECT t.issued_date, COUNT(*) as total_tickets, 
     SUM(t.canceled = 0) as issued_tickets, 
     SUM(CASE WHEN t.canceled = 0 THEN t.fee END) as total_amount, 
     SUM(c.region = 1) as num_region_1 
FROM tickets t JOIN 
    countries c 
    ON t.country_id = c.id 
GROUP BY t.issued_date;