2017-10-16 29 views
0

樣本數據來自同一列,但在不同的條件下

create table to_delete (otsn number, dtsn number,total_js number) 
insert into to_delete values (1,5,2) ; 
insert into to_delete values (2,4,3) ; 
insert into to_delete values (3,3,5) ; 
insert into to_delete values (4,2,7) ; 
insert into to_delete values (5,1,10) ; 

獲取和我需要根據otsn得到total_js總和dtsn

SELECT 
    j.otsn, 
    SUM(j.total_js), 
    j1.dtsn, 
    SUM(j1.total_js) 
FROM 
    to_delete j, 
    to_delete j1 
WHERE 
    j.otsn = j1.dtsn 
GROUP BY 
    j.otsn, 
    j1.dtsn; 

但在真正的表,我沒有得到預期的結果,要麼爲otsn或dtsn獲得正確的值,但不能同時獲得這兩個值。

我想要的輸出是

TSN, sum(total_js) of otsn, sum(total_js) of dtsn 
1, 2 , 10 
2, 3 

,7

TSN代表公交站點,otsn代表產地中轉站和dtsn代表DEST交通車站。 所以有一個表,其中orgin和dest都與總數有關。

如果非要計算出有多少人進入otsn然後 otsn,計數(total_js) 如果非要計算出有多少人從dtsn下車然後 dtsn,計數(total_js)

所以在最終的輸出我需要一個TSN,其總輸入和輸出總數。

+0

您修改要求的答案被給予,並沒有更新的問題後。爲什麼? –

+0

對不起,我新使用堆棧溢出,不知道如何更新問題。下次生病時要小心點。謝謝。 – user2653353

回答

1

取otsn和dtsn總和自加盟之前:

SQL> create table to_delete (otsn number, dtsn number,total_js number) ; 
Table created 
SQL> insert into to_delete values (1,5,2) ; 
1 row inserted 
SQL> insert into to_delete values (2,4,3) ; 
1 row inserted 
SQL> insert into to_delete values (3,3,5) ; 
1 row inserted 
SQL> insert into to_delete values (4,2,7) ; 
1 row inserted 
SQL> insert into to_delete values (5,1,10) ; 
1 row inserted 
SQL> WITH cte_otsn AS 
    2 (SELECT otsn, 
    3   SUM(total_js) o_total 
    4  FROM to_delete 
    5  GROUP BY otsn), 
    6 cte_dtsn AS 
    7 (SELECT dtsn, 
    8   SUM(total_js) d_total 
    9  FROM to_delete 
10  GROUP BY dtsn) 
11 SELECT d.dtsn, 
12   o.o_total, 
13   d.d_total 
14 FROM cte_otsn o 
15 JOIN cte_dtsn d 
16  ON d.dtsn = o.otsn; 
     DTSN O_TOTAL D_TOTAL 
---------- ---------- ---------- 
     1   2   10 
     2   3   7 
     5   10   2 
     4   7   3 
     3   5   5 

SQL> 

UPDATE:

SQL> create table to_delete (OTSN number,DTSN number,OHR number,DHR number,TOTAL_JS number); 
Table created 
SQL> INSERT INTO to_delete VALUES (1,5,2,3,2); 
1 row inserted 
SQL> INSERT INTO to_delete VALUES (2,4,2,4,3); 
1 row inserted 
SQL> INSERT INTO to_delete VALUES (3,3,3,3,5); 
1 row inserted 
SQL> INSERT INTO to_delete VALUES (4,2,1,4,7); 
1 row inserted 
SQL> INSERT INTO to_delete VALUES (5,1,4,1,10); 
1 row inserted 
SQL> WITH cte_data(tsn,hr,total,tsn_type) AS 
    2 (SELECT otsn, 
    3   ohr, 
    4   total_js, 
    5   'o' 
    6  FROM to_delete 
    7 UNION ALL 
    8 SELECT dtsn, 
    9   dhr, 
10   total_js, 
11   'd' 
12  FROM to_delete) 
13 SELECT tsn, hr, COALESCE(OCNT, 0) AS ocnt, COALESCE(dcnt, 0) AS dcnt 
14 FROM cte_data 
15 PIVOT (SUM(total) FOR tsn_type IN ('o' AS "OCNT", 'd' AS "DCNT")); 

     TSN   HR  OCNT  DCNT 
---------- ---------- ---------- ---------- 
     4   1   7   0 
     2   4   0   7 
     4   4   0   3 
     1   2   2   0 
     2   2   3   0 
     3   3   5   5 
     1   1   0   10 
     5   4   10   0 
     5   3   0   2 
9 rows selected 

SQL> 
+0

此查詢正在工作,但如果我添加另一個字段人力資源然後結果不正確, – user2653353

+0

編輯三回覆,不知道如何添加另一個編輯適當的格式, – user2653353

+0

可能你錯過了'd.dhr = i.ohr 'join,我修改了你的查詢,試着運行修改過的查詢,如果仍然不起作用,那麼共享元數據表的詳細信息和一些示例數據。 – San

0

這個甲骨文的解決辦法是..

SELECT a.otsn, SUM (a.total_js) OTSN_TOTAL, SUM (b.total_js) DTSN_TOTAL 
    FROM to_delete a, to_delete b 
    WHERE a.otsn = b.dtsn(+) 
    GROUP BY a.otsn; 

感謝 編碼快樂:)

+0

謝謝,在我的原始表中,我需要加入其他表「Z」..所以我加入這個Z表爲A和B? – user2653353

+0

喜歡說如果我需要爲其中一列的日期部分進行硬編碼,那麼我是否必須爲表a和b所說的做... a.dt = '03/AUG/2017'和b.dt = '03/AUG/2017' – user2653353

+0

最好不要在連接中使用'(+)'語法。這是非常古老的語法,可能會過時。 –

0

真實表可能有NULL值和缺失otsn/dtsn值,因爲它的SUM是給你不正確的值。如圖所示更好地使用FULL OUTER JOIN並處理NULL

SELECT 
    NVL(j.otsn,j1.dtsn), 
    SUM(CASE WHEN j.total_js IS NULL THEN 0 ELSE j.total_js END) OTSN_TOTAL, 
    SUM(CASE WHEN j1.total_js IS NULL THEN 0 ELSE j1.total_js END) DTSN_TOTAL 
FROM 
    to_delete j FULL OUTER JOIN 
    to_delete j1 
ON 
    j.otsn = j1.dtsn 
GROUP BY 
    j.otsn, 
    j1.dtsn; 
相關問題