【问题标题】:How to do Pivot (Count (*) ) functionality in Snowflake如何在 Snowflake 中执行 Pivot (Count (*)) 功能
【发布时间】:2021-05-12 15:46:19
【问题描述】:

我的查询如下:

我收到一个错误“意外的'*'”。在第 6 行,请告诉我,如何重写或更正此问题

select * from (SELECT gl gl_acc,
                               reg reg,
                               mapp map_name,
                               field as f1
                          FROM gl_acc a
                         WHERE TYPE = 'AGG') PIVOT (count(*)
                                             FOR f1
                                             IN  (
                                                 'JOURN' ,
                                                 'JOU' ,
                                                 'J' ,
                                                 'CASE_' ,
                                                 'JOUR' 
                                                ))as p;

谢谢, 去吧

【问题讨论】:

    标签: sql snowflake-cloud-data-platform snowflake-schema


    【解决方案1】:

    只使用条件聚合:

    SELECT gl, reg, mapp,
           SUM(CASE WHEN field = 'JOURN' THEN 1 ELSE 0 END) as journ,
           SUM(CASE WHEN field = 'JOU' THEN 1 ELSE 0 END) as jou,
           SUM(CASE WHEN field = 'J' THEN 1 ELSE 0 END) as j,
           SUM(CASE WHEN field = 'CASE_' THEN 1 ELSE 0 END) as case_,
           SUM(CASE WHEN field = 'JOUR' THEN 1 ELSE 0 END) as jour       
    FROM gl_acc a
    WHERE TYPE = 'AGG'
    GROUP BY gl, reg, mapp;
    

    或者更简单地使用COUNT_IF()

    SELECT gl, reg, mapp,
           COUNT_IF(field = 'JOURN') as journ,
           COUNT_IF(field = 'JOU') as jou,
           COUNT_IF(field = 'J') as j,
           COUNT_IF(field = 'CASE_') as case_,
           COUNT_IF(field = 'JOUR') as jour       
    FROM gl_acc a
    WHERE TYPE = 'AGG'
    GROUP BY gl, reg, mapp;
    

    【讨论】:

    • 作为 Gordon 答案的补充,通常情况下,答案中使用的条件聚合可以胜过 PIVOT 运算符。此外,我发现 Gordon 的代码比 OP 更整洁。
    • 如果我按照这个,我需要更改整个查询,为什么我不能使用 count(*) ?
    • @asd 。 . .我不明白评论。您可以使用COUNT_IF()。但是COUNT(*) 不会为各个列创建不同的值。
    • 好吧,我来自 Oracle 世界,我习惯在 pivot 中写 count(*),我想在雪花中使用同样的东西。这不可能吗?
    【解决方案2】:

    我也会使用条件聚合。它更易于阅读和维护。要使您的代码正常工作,您需要在 count 函数中指定您的确切计数。 您没有提供示例,但这里有一个工作代码供您查看它是如何工作的

    with cte (num0,num1,str1) as
    
    (select 1,1,'a' union all
     select 2,1,'a')
     
     select *
     from cte
     pivot (count(num1) for str1 in ('a', 'b')) as t(col1, col2, col2) 
    

    注意如何通过使用透视表中的as 子句来定义自定义列名来避免该子查询。

    【讨论】:

    • 我没有计算单个列,我正在计算(*)
    • @asd 请注意,如果您这样做count(f1),您将有效地计算行数——因此@Phil 在这里为您提供您正在寻找的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多