2016-12-15 5 views
1

用リスト/集計すべての項目私はのVerticaのDBで、次の表があります。SQL:1つの対応するトランザクションID

+-----+------+ 
| Tid | Item | 
+-----+------+ 
| 1 | A | 
| 1 | B | 
| 1 | C | 
| 2 | B | 
| 2 | D | 
+-----+------+ 

をそして、私は、この表を取得したい:

+-----+-------+-------+-------+ 
| Tid | Item1 | Item2 | Item3 | 
+-----+-------+-------+-------+ 
| 1 | A  | B  | C  | 
| 2 | B  | D  |  | 
+-----+-------+-------+-------+ 

は覚えておいてください私はtransaction_id(Tid)が持つことができる最大項目数を知らず、Tidあたりの項目の量は一定ではありません。私はjoinを使ってみましたが、どこで正しく動作するかは分かりませんでした。助けてくれてありがとう。

答えて

1

はにVerticaにはPIVOT能力はありません。列は、クエリの一部としてオンザフライで定義することはできません。あなたは指定する必要があります。

おそらく、このStack Overflow answerで見つかるものなど、UDXを使用して集約するなど、他のオプションがあります。しかし、これは単一のフィールドにそれらを配置します。

唯一の他の選択肢は、Pythonのようなものを使ってクライアント側でピボットを構築することです。それ以外の場合は、クエリの列リストを生成する方法が必要です。

私の例では、あなたはユニークな(Tid、Item)セットを扱っていると仮定しています。ニーズに合わせて変更する必要があるかもしれません。

まずあなたがサポートするために必要な項目場合は最大数を決定する必要があります:

with Tid_count as (
    select Tid, count(*) cnt 
    from mytable 
    group by 1 
) 
select max(cnt) 
from Tid_count; 

そして、あなたがサポートするために持っていたほとんどのアイテムを言わせては4だった、あなたはその後、ピボットにSQLを生成します:

with numbered_mytable as (
    select Tid, 
      Item, 
      row_number() over (partition by Tid order by Item) rn 
    from mytable 
) 
select Tid, 
     MAX(decode(rn,1,Item)) Item1, 
     MAX(decode(rn,2,Item)) Item2, 
     MAX(decode(rn,3,Item)) Item3, 
     MAX(decode(rn,4,Item)) Item4 
from numbered_mytable 
group by 1 
order by 1; 

それとも、SQLを生成したいが、あなたはXアイテム以上のものを持っていることは決してないだろう知っていない場合は、あなただけX.に行く静的フォーム

+0

これは実際に動作します!どうもありがとう。クイックフォローアップ:あなたはどのように逆のやり方をしますか?ここでの動機は、1つの行を削除してテーブルを元に戻すことができるようにすることです。これはアソシエーションパターンマイニングのためですが、あなたのパターンに特定のItemが必要だった場合です。そうすれば、あなたのアイテムを含まないすべてのトランザクションを削除することができます。 – valenzio

+1

私が正しいと分かっていれば、それぞれのアイテムについて、あなたはすべてのユニオンをしなければならないでしょう。例: 'Tid、Item1をItemから選択... union allはTidを、Item2は...をユニオンすべてをTid、Item3を...から選択します。 – woot

0

あなたはこれを試すことができます。

Create table #table(id int,Value varchar(1)) 

insert into #table 
select 1,'A' 
union 
select 1,'B' 
union 
select 1,'C' 
union 
select 2,'B' 
union 
select 2,'D' 
select id,[1] Item1,[2] Item2,[3] Item3 from 
(
select id,Dense_rank()over(partition by id order by value)Rnak,Value from #table 
)d 
Pivot 
(Min(value) for Rnak in ([1],[2],[3]))p 

drop table #table 
+0

を作成することができますあなたのコードはに非常に具体的です私の例。しかし私の例は要約だけです。実際のケースでは、そこにはいくつのアイテムがあるのか​​、アイテムの最大量が1つのtidに対応しているのか分かりません。 – valenzio

+0

Verticaには 'PIVOT'はありません。これはSQL Serverの回答です。 – woot

関連する問題