簡體   English   中英

如何在第一行中顯示第二行和第三行列值作為sql中的列值

[英]How to show second and third row column values in first row as column values in 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

任何人請幫助我。 提前致謝

這個問題經常出現在論壇中,這是可以理解的,因為SQL不是為了實現人們發現如此有用的數據透視表/交叉表功能而構建的。 一個好的方法是將數據移動到自然的地方,如電子表格或數據操作語言,如R / python / Julia。 在任何情況下,都可以使用tablefunc擴展在Postgresql中tablefunc 查詢看起來很復雜,但它是有啟發性的,如果你必須留在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函數采用具有三列的表,例如A B C並創建一個表,其中第一列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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM