teradata基于列连接行

时间:2015-12-16 00:07:05

标签: sql teradata

我有一张如下表格

Cstmr_ID | PPM | prepaid |home_phone|srvc_num
1        |Y    |N        |N         |0422222222
1        |Y    |N        |N         |0433333333
1        |N    |N        |Y         |0333333333 
2        |y    |N        |N         |0455555555
2        |N    |N        |Y         |0355555555

现在我想要一张这样的桌子。

Cstmr_id  | PPM_srvc_num         |prepaid_srvc_num|home_phone_srvc_num
1         |0422222222,0433333333 |                |0333333333
2         |0455555555            |                |0355555555

1 个答案:

答案 0 :(得分:0)

您要做的是转置您的表,然后对连接记录进行分组。由于Teradata 14.10有TD_UNPIVOT功能可以转置,但我还没有使用它。

如果您可以在数字中使用固定的上限(N),则结果中的一个Cstmr_id的相同列可以使用case语句和row_number()来模拟转置和组连接。

select Cstmr_id
, max(case when PPM='Y' and rn=1 then srvc_num else null end) 
||  coalesce(max(case when PPM='Y' and rn=2 then ','||srvc_num else null end),'')
...
||  coalesce(max(case when PPM='Y' and rn=N then ','||srvc_num else null end),'')
as PPM_srvc_num
-- add the further lines for prepaid ='Y' and home_phone='Y'
from (
  select *
  , row_number() over (partition by Cstmr_ID, PPM, prepaid, home_phone) as rn 
  from your_table 
) dt
group by 1

我还没有对上面的代码进行过测试,但实际上我已经为自己完成了这种类型的转换,所以它应该在完全写出你的执行表之后才能工作