如何在 Snowflake 中执行数据透视(计数(*))功能

How to do Pivot (Count (*) ) functionality in Snowflake

我的查询如下:

我收到“意外的‘*’”错误。在第 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;

谢谢, 去

只使用条件聚合:

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;

我也会选择条件聚合。它更容易阅读和维护。要让您的代码正常工作,您需要在 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 子句来定义自定义列名称,从而避免该子查询。