UNPIVOT 一个 presto 表

Posted

技术标签:

【中文标题】UNPIVOT 一个 presto 表【英文标题】:UNPIVOT a presto table 【发布时间】:2022-01-18 09:54:44 【问题描述】:

我对使用 presto 的 SQL 非常陌生,并试图取消透视如下所示的表: Pivot 让它看起来像这样:Unpivoted

我尝试过使用 UNPIVOT 函数,我尝试过使用 unnest 进行 CROSS JOINING。我终于认为我已经使用 UNION 弄清楚了,但我可以安静地得到正确的查询。你能把我推向正确的方向吗?

这就是我的工作:

SELECT CASE_ID, Account, Amount 
FROM 
TEST_TABLE 
CROSS JOIN UNNEST (
ARRAY['Factor_Cost','Unfactor_cost'],
ARRAY[Factor_Cost,Unfactor_cost]
) t2(account, amount)

非常感谢, 回复

【问题讨论】:

【参考方案1】:

你在正确的轨道上。可以使用cross join + case 表达式根据账户值计算金额:

SELECT t1.CASE_ID, 
       t2.Account,
       case when t2.Account = 'Factor_Cost' then t1.factor_cost else t1.unfactor_cost end  Amount 
FROM 
TEST_TABLE t1 
CROSS JOIN (
values('Factor_Cost'),('Unfactor_cost')
) t2(account)

交叉连接将通过帐户值和 CASE 表达式复制行以将 t1 中的相应列作为 Amount。

或者同样使用 CROSS JOIN UNNEST,不用 CASE 表达式:

SELECT t1.CASE_ID, 
       t2.Account,
       t2.Amount 
FROM 
TEST_TABLE t1 
CROSS JOIN UNNEST(
ARRAY['Factor_Cost','Unfactor_cost'],
ARRAY[t1.factor_cost,t1.unfactor_cost]
) t2(account,amount)

或使用 UNION ALL 相同(效率较低的方法)

SELECT CASE_ID, 'Factor_Cost' Account, factor_cost Amount from TEST_TABLE t1 
union all
SELECT CASE_ID, 'Unfactor_cost' Account, unfactor_cost Amount from TEST_TABLE t1

所有这些查询都可以产生不同排序的结果。只有使用额外的 ORDER BY 才能保证相同的订单。

【讨论】:

我正在使用第一个并收到此错误。抱歉,就像我说的我对 SQL 不是很有经验。 “第 14:5 行:输入 't2' 不匹配。期望:',', 'EXCEPT', 'FROM', 'GROUP', 'HAVING', 'INTERSECT', 'LIMIT', 'OFFSET', 'ORDER', 'UNION', 'WHERE', TAAL[BLAME_dirs,www/flib/presto/]" @RohitAnand 好奇怪我的答案中的代码已经过测试,它适用于 Presto

以上是关于UNPIVOT 一个 presto 表的主要内容,如果未能解决你的问题,请参考以下文章

Pivot Unpivot 创建映射表

pivot和unpivot sql表

Excel 2010 Unpivot 数据或利用 MySQL 进行 Unpivot

如何在SQL中产生交叉式数据表(枢纽分析表)Part 2(PIVOT,UNPIVOT)

Presto:如果原始查询未返回任何行,则返回另一个表或虚拟值/表

UnPivot 多列 MSSQLServer