2017-08-29 3 views
0

2つのテーブルがあります。SQL:関連するテーブルの条件に基づいた数と合計

国(ID、名前、地域);

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)に販売されたチケットの数を表示したいとします。

Iは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, 
(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

を私は次のことを試みたが、結果は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 
    ,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、地域、
2017年8月15日をtotal_tickets、    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; 
関連する問題