我正在嘗試使用交叉表或任何其他方式將行轉換為 postgres 中的列
表格1:
| Order_Id | order_line_id |
|---|---|
| 1 | 1001 |
| 1 | 1 |
| 1 | 2 |
表 2:
| Order_Id | order_line_id | 型別 | 數量 |
|---|---|---|---|
| 1 | 1001 | 蘋果 | 60 |
| 1 | 1001 | 蘋果 | 90 |
| 1 | 1 | 蘋果 | 0 |
| 1 | 1 | 橙 | 32 |
| 1 | 1 | 獼猴桃 | 45 |
| 1 | 2 | 蘋果 | 12 |
| 1 | 2 | 橙 | 76 |
| 1 | 2 | 橙 | 98 |
結果:
| Order_Id | order_line_id | 蘋果1 | 蘋果2 | 橙色1 | 橙色2 | 奇異果1 | 奇異果2 |
|---|---|---|---|---|---|---|---|
| 1 | 1001 | 60 | 90 | 無效的 | 無效的 | 無效的 | 無效的 |
| 1 | 1 | 0 | 無效的 | 32 | 無效的 | 無效的 | 45 |
| 1 | 2 | 12 | 無效的 | 76 | 98 | 無效的 | 無效的 |
列名是已知的,但列值可能是重復的,它們應該彼此相鄰。
我努力使用交叉表和 json(至少試圖引入 json)無法取得進展。有什么幫助嗎?
我試圖將行轉置為列,但列值可能是重復的。重復值必須仍位于單獨的列中。我試圖在交叉表中實作,但它沒有用
uj5u.com熱心網友回復:
您的問題無法解決,crosstab因為結果中的列串列必須根據Table 2可能隨時更新的行動態計算。
存在解決您的問題的解決方案。它包括 :
- 根據 a 中的狀態使用
composite type預期的列標簽串列動態創建Table 2plpgsql根據程序 - 在執行查詢之前呼叫程序
- 通過將表 2 的行按
Order_id和分組來構建查詢Order_line_id分組來構建查詢,以便將這些行聚合到 taget 行結構中 - 將目標行轉換為
json物件,并json使用json_populate_record函式和composite type
步驟1 :
CREATE OR REPLACE PROCEDURE composite_type() LANGUAGE plpgsql AS $$
DECLARE
column_list text ;
BEGIN
SELECT string_agg(m.name || ' text', ', ')
INTO column_list
FROM
( SELECT Type || generate_series(1, max(count)) AS name
FROM
( SELECT lower(Type) AS type, count(*)
FROM table_2
GROUP BY Order_Id, Order_line_id, Type
) AS s
GROUP BY Type
) AS m ;
DROP type IF EXISTS composite_type ;
EXECUTE 'CREATE type composite_type AS (' || column_list || ')';
END ; $$
第2步 :
CALL composite_type() ;
步驟 3,4:
SELECT t.Order_Id, t.Order_line_id
, (json_populate_record(null :: composite_type, json_object_agg(t.label, t.Amount))).*
FROM
( SELECT Order_Id, Order_line_id
, lower(Type) || (row_number() OVER (PARTITION BY Order_Id, Order_line_id, Type)) :: text AS label
, Amount
FROM table_2
) AS t
GROUP BY t.Order_Id, t.Order_line_id ;
最終結果是:
| order_id | order_line_id | 獼猴桃1 | 橙色1 | 橙色2 | 蘋果1 | 蘋果2 |
|---|---|---|---|---|---|---|
| 1 | 1 | 45 | 32 | 無效的 | 0 | 無效的 |
| 1 | 2 | 無效的 | 98 | 76 | 12 | 無效的 |
| 1 | 1001 | 無效的 | 無效的 | 無效的 | 60 | 90 |
在dbfiddle中查看完整的測驗結果
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/528915.html
上一篇:JS資料結構與演算法-佇列結構
下一篇:如何參考SQL查詢中的一列
