2017-08-29 79 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;