2017-06-15 106 views
1

我有這種情況,我必須在第一行顯示第二行&第三行列值作爲列值在End。如何在第一行顯示第二行和第三列的值作爲sql中的列值

OrgCode | OrgType 
------ | ------ 
001902001| 5 
001902005| 5 
001902000| 4 
001903000| 4 

Id | OrgType | materialId | materialCount 
--- | ------ | -----------| ----------- 
    1 | 5  | 793167  | 3 
    2 | 5  | 793257  | 3 
    3 | 5  | 794808  | 3 
    4 | 4  | 793167  | 10 
    5 | 4  | 793257  | 10 
    6 | 4  | 794808  | 10 

基於這兩個表,我需要最終的輸出,如下圖所示:

OrgCode | OrgType | Item1 | Count1 | Item2 | Count2 | Item3 | Count3 
------ | ------- ----- ------ ------- ------- ------ ------ 
001902001| 5  | 793167 | 3  | 793257 | 3  | 794808 | 3 
001902005| 5  | 793167 | 3  | 793257 | 3  | 794808 | 3 
001902000| 4  | 793167 | 10 | 793257 | 10 | 794808 | 10 
001903000| 4  | 793167 | 10 | 793257 | 10 | 794808 | 10 

任何一個請幫助我在此。 在此先感謝

+0

您的需求似乎沒有我的權利MaterialID 793167只能匹配OrgType 5,我看到,甚至被4匹配,這似乎不符合邏輯 – Joby

+1

的MySQL, SQL Server和PostgreSQL是非常不同的產品。我已經刪除了標籤。請僅標記您正在使用的一個DBMS。 –

+0

至於問題:我建議你不要使用SQL來做這件事,而是用你的應用來處理這個問題(Java,C#,PHP或任何你正在使用的簡單循環)。 –

回答

0

這個問題經常出現在論壇中,這是可以理解的,因爲SQL不是爲了實現這種樞軸表/交叉表功能而發現的。一個好的方法是將數據移到某處,比如電子表格或數據操縱語言,如R/python/Julia。在任何情況下,都可以使用tablefunc擴展名在Postgresql內部完成。查詢看起來很複雜,但它是有益的,如果你要留在PostgreSQL內部(這是方便),那麼這是要走的路:

CREATE extension tablefunc ; 

-- table are called table1 and table2 

SELECT tt.orgcode, 
     ss.orgtype, 
     item1, 
     count1, 
     item2, 
     count2, 
     item3, 
     count3 
FROM 
    crosstab($$ select 
     a.orgcode, 
     'item'||row_number() over (partition by a.orgcode order by b.materialid) as name, 
     b.materialid 
    from table1 a,table2 b where a.orgtype=b.orgtype $$) AS 
     tt(orgcode integer, item1 integer, item2 integer, item3 integer), 
    crosstab ($$ select 
     a.orgcode, 
     'count'||row_number() over (partition by a.orgcode order by b.materialid) as name, 
     b.materialcount 
    from table1 a, table2 b where a.orgtype=b.orgtype $$) AS 
     qq(orgcode integer, count1 integer, count2 integer, count3 integer), 
    table1 ss 
WHERE tt.orgcode=qq.orgcode 
    AND tt.orgcode=ss.orgcode 
ORDER BY orgtype DESC, 
     tt.orgcode; 

crosstab功能需要一個表有三列,也就是說,ABC並創建第一列AB的值作爲更多列,並且將值C作爲記錄的內容。該查詢會爲項目代碼和計數調用crosstab兩次。

輸出是很好的:

orgcode | orgtype | item1 | count1 | item2 | count2 | item3 | count3 
---------+---------+--------+--------+--------+--------+--------+-------- 
1902001 |  5 | 793167 |  3 | 793257 |  3 | 794808 |  3 
1902005 |  5 | 793167 |  3 | 793257 |  3 | 794808 |  3 
1902000 |  4 | 793167 |  10 | 793257 |  10 | 794808 |  10 
1903000 |  4 | 793167 |  10 | 793257 |  10 | 794808 |  10 
(4 rows) 
+0

謝謝。這有很大的幫助。 – user2977940

相關問題