制作条件聚合

时间:2017-01-18 09:09:34

标签: sql snowflake-datawarehouse

出于商业原因,我有一个棘手的分组问题,我有一个像这样的值的表


----------------------------
| NAME  |  TYPE   |  VALUE  |
----------------------------
|   N1  |   T1    |   V1    |
|   N1  |   T2    |   V2    |
|   N1  |  NULL   |   V3    |
|   N2  |   T2    |   V4    |
|   N2  |  NULL   |   V5    |
|   N3  |  NULL   |   V6    |
-----------------------------

我需要以某种方式对其进行分组,

  • 第一级分组将按名称进行。
  • 在第二级,
    • 当可用类型为T1,T2和NULL时,将T1和NULL组合在一起,并将T2分开组合。
    • 当可用类型为T2和NULL时,使用T2组合为NULL。
    • 当NULL是唯一可用的类型时,只需按原样使用它。

上表的预期O / P为,

----------------------------
|   N1  |   T1    | V1+V3   |
|   N1  |   T2    |   V2    |
|   N2  |   T2    | V4+V5   |
|   N3  |  NULL   |   V6    |
-----------------------------

如何在雪花sql中实现这一点。或者任何其他服务器,这样我就可以在Snowflake中找到一个等价物。

1 个答案:

答案 0 :(得分:3)

以下查询应该有效:

SELECT t1.NAME, COALESCE(TYPE, MIN_TYPE), SUM(VALUE)
FROM mytable AS t1
JOIN (
   SELECT NAME, MIN(TYPE) AS MIN_TYPE
   FROM mytable
   GROUP BY NAME
) AS t2 ON t1.NAME = t2.NAME    
GROUP BY t1.NAME, COALESCE(TYPE, MIN_TYPE)

查询使用派生表,以便按MIN(TYPE)提取NAME值。使用COALESCE,我们可以将NULL转换为T1T2

修改

您可以使用以下查询创建预期结果集的透视版本:

SELECT NAME, 
       CASE 
          WHEN T1SUM IS NULL THEN 0
          ELSE COALESCE(T1SUM, 0) + COALESCE(NULLSUM,0)
       END AS T1SUM,
       CASE 
          WHEN T1SUM IS NULL AND T2SUM IS NOT NULL 
             THEN COALESCE(T2SUM, 0) + COALESCE(NULLSUM,0)
          ELSE COALESCE(T2SUM, 0)
       END AS T2SUM,
       CASE 
          WHEN T1SUM IS NULL AND T2SUM IS NULL THEN COALESCE(NULLSUM,0)
          ELSE 0
       END AS NULLSUM  
FROM (
   SELECT NAME, 
          SUM(CASE WHEN TYPE = 'T1' THEN VALUE END) AS T1SUM,
          SUM(CASE WHEN TYPE = 'T2' THEN VALUE END) AS T2SUM,
          SUM(CASE WHEN TYPE IS NULL THEN VALUE END) AS NULLSUM
   FROM mytable
   GROUP BY NAME) AS t