我有一张如下表:
Geography Period Campaign VariableName VariableValue
11111 4/1/2017 ABC TV_Imp 0.4
11111 4/2/2017 ABC TV_Imp 0.5
11112 4/1/2017 ABC TV_Imp 0.1
11113 4/2/2017 ABC TV_Clicks 0.7
11113 4/2/2017 CDE TV_Clicks 0.7
11113 4/3/2017 FGH TV_Imp 0.5
我希望将该表转换/转换为:
Geography Period ABC_TV_Imp ABC_TV_Clicks CDE_TV_Clicks FGH_TV_Imp
11111 4/1/2017 0.4 0 0 0
11111 4/2/2017 0.5 0 0 0
11112 4/1/2017 0.1 0 0 0
11113 4/2/2017 0 0.7 0 0
11113 4/2/2017 0 0 0.7 0
11113 4/3/2017 0 0 0 0.5
这里的问题是我提前不知道Campaign
和VariableName
列下的值是什么。它们的范围可以从每个约100-400个不同的值。由于Vertica也没有PIVOT
API,也没有可能在那里编写动态SQL,我想知道在Vertica中创建数据透视表的最佳方法是什么。
另外,因为原始/源表有大约180米的行,所以进行旋转的最有效(计算)方式。我考虑过将原始表格拆分三个或更多(按Geography
,Period
,Campaign
和VaribleName
进行分组,然后按Campaign
和{{1进行拆分在将它们重新合并之前,在每个组中启动单个透视过程。实际上,我希望能够“平行化”。旋转过程加快时间。那会有帮助吗?
先谢谢您的建议/建议!
答案 0 :(得分:1)
此答案解释了如何生成所需的SQL。生成SQL后,您需要运行它。
首先:
select distinct campaign, variable_name
from t;
这将生成您的所有代码。将其放在电子表格中并使用公式创建该行:
(case when campaign = $campaign and variable_name = $variable_name then variable_value else 0 end) as $campaign_$variable_name,
您也可以在SQL中执行此操作:
select distinct
replace(replace('(case when campaign = ''$campaign'' and variable_name = ''$variable_name'' then variable_value else 0 end) as $campaign_$variable_name,',
'$campaign', campaign
), $variable_name, variable_name
)
from t;
这是您需要编写的大部分SQL。执行以下操作:
select geography, period,
放在第一行from t group by geography, period
答案 1 :(得分:1)
创建表数据透视表
(
master_country varchar(25)
);
select max(decode(rn, 1, master_country, null)) || ', ' ||max(decode(rn, 2, master_country, null)) || ', ' ||max(decode(rn, 3, master_country, null)) || ', ' ||max(decode(rn, 4, master_country, null)) || ', ' ||max(decode(rn, 5, master_country, null)) master_country from (select master_country, row_number() over () rn from pivotst) foo;
插入最重要的值(“海得拉巴”);
插入最重要的值('chennai');
从pivost中选择*;
选择max(decode(rn,1,master_country,null))|| ','|| max(decode(rn,2,master_country,null))|| ','|| max(decode(rn,3,master_country,null))|| ','|| max(decode(rn,4,master_country,null))|| ','|| max(decode(rn,5,master_country,null))master_country来自(选择master_country,row_number()超过()rnestpstst)foo;