2016-08-24 8 views
2

リンクされた表のService_timesの合計を見つけるのを手伝ってください。SQL結合の値の合計の使用方法

CREATE TABLE incidents (incident_id int,date_logged datetime,usr_id int,dept_id int,item_id int, cust_id int) 

insert into incidents values 
('1001', '8/20/2016', '190', '3', '800', '10'), 
('1002', '8/21/2016', '111', '4', '810', '12'), 
('1003', '8/22/2016', '190', '3', '800', '10'), 
('1004', '8/23/2016', '111', '4', '822', '12') 


Create TABLE actions (act_id int, act_type varchar(50) , incident_id int, usr_id int ,date_actioned datetime, service_time money) 

Insert into actions VALUES 
('1', 'TRAVEL', 1001, 190, 8/20/2016, 20), 
('2', 'ASSIGN', 1001, 2, 8/21/2016, 1), 
('3', 'TRAVEL', 1001, 190 ,8/22/2016, 10), 
('4', 'REMOTE', 1001, 190, 8/23/2016, 30), 
('5', 'TRAVEL', 1002, 111, 8/21/2016, 40), 
('6', 'ASSIGN', 1002, 2, 8/22/2016 ,1), 
('7', 'REMOTE', 1002, 111, 8/23/2016, 30), 
('8', 'TRAVEL', 1002, 111, 8/24/2016, 60), 
('9', 'TRAVEL', 1003, 190, 8/22/2016, 45), 
('10', 'ASSIGN', 1003, 2, 8/23/2016 ,1), 
('11', 'REMOTE', 1003, 190 ,8/23/2016 ,10), 
('12', 'REMOTE', 1003, 190 ,8/23/2016 ,20), 
('13', 'ASSIGN', 1004, 2 ,8/23/2016 ,1), 
('14', 'TRAVEL', 1004, 111, 8/23/2016, 20), 
('15', 'TRAVEL', 1004, 111, 8/23/2016, 20), 
('16', 'REMOTE', 1004, 111, 8/23/2016, 20) 


CREATE TABLE inc_data (incident_id int,Rep1 char(1), Rep2 char(1), Rep3 char(1), Res1 char(1), Res2 char(1), Res3 char(1)) 

insert into inc_data values 
(1001, 'y', 'y', 'y', 'y', 'y', 'n'), 
(1002, 'n', 'n', 'n', 'n', 'n', 'n'), 
(1003, 'y', 'y', 'n', 'n', 'n', 'n'), 
(1004, 'y', 'y', 'y', 'y' , 'y', 'y') 

マイクエリ

SELECT i.usr_id, 
     COUNT(CASE WHEN inc_data.Rep3 = 'y' THEN 1 END) AS RespBreach, 
     COUNT(CASE WHEN inc_data.Res3 = 'y' THEN 1 END) AS ResBreach, 
     COUNT(i.incident_id)as CallCount, 
     (SELECT  ISNULL(SUM(A.service_time), 0) AS Expr1 
     FROM actions AS WHERE A.act_type= 'TRAVEL')) AS Travel_Time, 
     (SELECT  ISNULL(SUM(A.service_time), 0) AS Expr1 
     FROM actions AS WHERE A.act_type= 'REMOTE')) AS Remote_Time  
FROM incidents as i 
INNER JOIN inc_data ON i.incident_id= inc_data.incident_id 
INNER JOIN actions act1 on i.incident_id=act1.incident_id 
GROUP BY i.usr_id 

期待される結果:

+--------+-----------+-------------+-------------+-----------+-----------+--+--+--+ 
| usr_id | Callcount | Travel_Time | Remote_Time | RepBreach | ResBreach | | | | 
+--------+-----------+-------------+-------------+-----------+-----------+--+--+--+ 
| 190 |   2 |   75 |   60 |   1 |   0 | | | | 
| 111 |   2 |   140 |   50 |   1 |   1 | | | | 
+--------+-----------+-------------+-------------+-----------+-----------+--+--+--+ 
+0

プラスのサンプルデータのための1、あなたはまた、について少し説明できるロジック – TheGameiswar

答えて

1

リモートと旅行時間を計算するための相関サブクエリの必要はありません。アクション表が結合されると、単に条件付き集計を使用できます。

また、関係は1対多であるため、別個のincident_idにカウントする必要があります。

SELECT i.usr_id, 
     COUNT(DISTINCT CASE WHEN inc_data.Rep3 = 'y' THEN 1 END) AS RespBreach, 
     COUNT(DISTINCT CASE WHEN inc_data.Res3 = 'y' THEN 1 END) AS ResBreach, 
     COUNT(DISTINCT i.incident_id) as CallCount, 
     SUM(CASE WHEN act1.act_type= 'TRAVEL' THEN ISNULL(act1.service_time, 0) ELSE 0 END) AS Travel_Time, 
     SUM(CASE WHEN act1.act_type= 'REMOTE' THEN ISNULL(act1.service_time, 0) ELSE 0 END) AS Remote_Time  
FROM incidents as i 
INNER JOIN inc_data ON i.incident_id= inc_data.incident_id 
INNER JOIN actions act1 on i.incident_id=act1.incident_id 
GROUP BY i.usr_id 

Sample Demo

+0

:クエリのおかげで、私は、ユーザー111によって事件のアクション中(REMOTE)1つの以上のアクション= 1001を持っている場合。ユーザー190に追加されています。これをどのようにフィルタリングできますか。あなたの助けを感謝しました。編集したデモはこちら:http://rextester.com/WLEMT12994 –

関連する問題