在Snowflake中对多列进行数据透视

8
无法在Snowflake中对多个列进行数据透视。
这样是有效的:
--DROP TABLE "PUBLIC".MONTHLY_SALES
create or replace table monthly_sales(empid int, amount int, month text)
    as select * from values
    (1, 10000, 'JAN'),
    (1, 400, 'JAN'),
    (2, 4500, 'JAN'),
    (2, 35000, 'JAN'),
    (1, 5000, 'FEB'),
    (1, 3000, 'FEB'),
    (2, 200, 'FEB'),
    (2, 90500, 'FEB'),
    (1, 6000, 'MAR'),
    (1, 5000, 'MAR'),
    (2, 2500, 'MAR'),
    (2, 9500, 'MAR'),
    (1, 8000, 'APR'),
    (1, 10000, 'APR'),
    (2, 800, 'APR'),
    (2, 4500, 'APR');
    
   
 SELECT * FROM monthly_sales
 pivot(
        sum(amount)
        for month in ('JAN', 'FEB', 'MAR', 'APR')
        ) AS p;
 

但是当我添加额外的聚合时,我收到了一个错误。

SELECT * FROM monthly_sales
 pivot(
        sum(amount)
        , count(amount)
        for month in ('JAN', 'FEB', 'MAR', 'APR')
        ) AS p;

QL错误[1003] [42000]: SQL编译错误:第4行语法错误,位置5处出现意外的“,”,第4行语法错误,位置12处出现意外的“(”,第5行语法错误,位置45处出现意外的“)”。

欢迎任何指导。

2个回答

7

Felipe是正确的,您只能在PIVOT中使用一个聚合函数。

但根据您想要实现的目标,以下查询可能有所帮助。

SELECT 'SUM' RECORD_TYPE, * FROM (SELECT * FROM monthly_sales
 pivot(
        SUM(amount) 
        for month in ('JAN', 'FEB', 'MAR', 'APR')
        ) AS p)
UNION ALL
SELECT 'COUNT', * FROM (SELECT * FROM monthly_sales
 pivot(
        count(amount) 
        for month in ('JAN', 'FEB', 'MAR', 'APR')
        ) AS p)

输出:

Row RECORD_TYPE EMPID   'JAN'     'FEB'   'MAR'  'APR'
1     SUM           1   10400      8000   11000  18000
2     SUM           2   39500     90700   12000   5300
3     COUNT         1       2         2       2      2
4     COUNT         2       2         2       2      2


谢谢。我卡在让函数正常工作上,而不是采用实际的解决方法。感谢您的指导。 - CJones
很高兴能帮到你。 - demircioglu

5
根据Snowflake中PIVOT的文档,您只能获取一个聚合值:
SELECT ...
FROM ...
   PIVOT ( <aggregate_function> ( <pivot_column> )
            FOR <value_column> IN ( <pivot_value_1> [ , <pivot_value_2> ... ] ) )

[ ... ]

如果您发布一个带有示例输入和输出的不同问题,我们可以尝试为其找到解决方案。

至于这个问题,我不知道如何在关系表中表示两种不同的聚合。但至少我们可以回答为什么会出现语法错误: PIVOT 不支持多个聚合。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接