【问题标题】:UNPIVOT a presto tableUNPIVOT 一个 presto 表
【发布时间】: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)

非常感谢, 回复

【问题讨论】:

    标签: sql presto unpivot


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 2020-06-19
    • 1970-01-01
    相关资源
    最近更新 更多