2017-04-05 7 views
0

私はこのような構造の入力表に検索 - Postgresqlの

入力があります。

のCol1を| Col2 | Col3


O1 | P1 | 100
O1 | P2 | 200
O1 | P3 | 300
O2 | P1 | 100
O2 | P2 | 200

異なる組み合わせを見つけて、別の列の値を同時に集計する必要があります。

出力期待値:

Col1 | Col2 | CO3


O1 | P1、P2 | 300

O1 | P2、P3 | 500

O1 | P3、P1 | 400

O1 | P1、P2、P3 | 600

O2 | P1、P2 | 300

この問題にアプローチする方法と開始する場所についてのヘルプが必要です。

+1

男、私はあなたの答えを持っていて、あなたは*完全に*質問を変えました。 :(以前のバージョンでは、 'string_agg'は単純な解決策でした。https://www.postgresql.org/docs/devel/static/functions-aggregate.html – opatut

+0

クラスの宿題は?それはそうだと言います。) –

+0

母..それはクラスの宿題LOLではありません。私はビジネス上の問題の1つをここで再販売しました –

答えて

1

あなたはこれを試すことができます(Xは、あなたのテーブルです)。(データとあなたが投稿として)

WITH RECURSIVE R AS (SELECT X.COL1, X.COL2, CAST(X.COL2 AS VARCHAR(100)) AS COMBI, COL3 AS TOT 
      FROM X 
      UNION ALL 
      SELECT X.COL1, X.COL2, CAST(r.COMBI || CAST(',' AS VARCHAR(1)) || X.COL2 AS VARCHAR(100)), X.COL3+R.TOT AS TOT 
      FROM R 
      INNER JOIN X ON X.COL2 > R.COL2 AND X.COL1 = R.COL1) 
SELECT COL1, COMBI, TOT 
FROM R 
WHERE LENGTH(COMBI) >LENGTH(COL2) 
ORDER BY COL1, LENGTH(COMBI), COMBI 
; 

出力:

col1 combi tot 
1 O1 P1,P2 300 
2 O1 P1,P3 400 
3 O1 P2,P3 500 
4 O1 P1,P2,P3 600 
5 O2 P1,P2 300 

出力(O1に別の行のP4を追加):

col1 combi tot 
1 O1 P1,P2 300 
2 O1 P1,P3 400 
3 O1 P1,P4 500 
4 O1 P2,P3 500 
5 O1 P2,P4 600 
6 O1 P3,P4 700 
7 O1 P1,P2,P3 600 
8 O1 P1,P2,P4 700 
9 O1 P1,P3,P4 800 
10 O1 P2,P3,P4 900 
11 O1 P1,P2,P3,P4 1000 
12 O2 P1,P2 300 
+0

ありがとう、Etsa。あなたは仕事の時間を節約しました。 –

関連する問題