2016-12-15 7 views
1

에 대한 모든 항목 I Vertica의 DB를에 다음과 같은 테이블이 있습니다SQL : 목록/집계 한 해당 트랜잭션 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 당 항목의 양이 일정하지 않습니다. 조인을 사용하여 시도했지만 어디에서 제대로 작동하지 못했습니다. 도와 주셔서 감사합니다.

답변

1

는 Vertica의에는 PIVOT 능력이 없습니다. 열은 쿼리의 일부로 즉시 정의 할 수 없습니다. 지정해야합니다.

Stack Overflow answer에서 찾을 수있는 것과 같은 UDX를 사용하여 집계에 연결하는 것과 같은 다른 옵션이있을 수 있습니다. 그러나 이것은 그것들을 하나의 필드에 넣을 것입니다.

유일한 대안은 파이썬과 같은 것을 사용하여 클라이언트 측에서 피벗을 빌드하는 것입니다. 그렇지 않으면 쿼리에 대한 열 목록을 생성하는 방법이 있어야합니다.

예를 들어, 고유 한 (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 항목 이상 없을거야 모르는 경우, 당신은 단지

+0

이것은 실제로 작동합니다! 고마워. 빠른 후속 조치 : 어떻게하면 반대 방향으로 할 수 있습니까? 여기서 하나의 행을 삭제하고 테이블을 다시 변환 할 수 있기를 바랍니다. 이것은 Association 패턴 마이닝을위한 것이지만, 패턴에 특정 Item이 필요한 경우에 해당합니다. 이렇게하면 상품이 포함되지 않은 모든 거래를 삭제할 수 있습니다. – valenzio

+1

내가 이해한다면, 각 아이템에 대해, 당신은 모두 노조를해야 할 것입니다. 예 :'Tid, Item1을 Item from ...으로 선택하십시오. union all은 Tid를 선택하고, Item2는 ... union을 선택하고, 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

코드를 X와 간다 정적 양식을 만들 수는 매우 다릅니다 내 예. 그러나 나의 예는 추상적 인 것이다. 실제 사례에서 나는 얼마나 많은 다른 항목이 있고 항목의 최대량이 하나의 항목에 해당하는지 알지 못합니다. – valenzio

+0

Vertica에는 'PIVOT'이 없습니다. 이것은 SQL Server 응답입니다. – woot