4

由于我们的业务原因,我遇到了棘手的分组问题,我有一张表,其值如下

----------------------------
| 姓名 | 类型 | 价值 |
----------------------------
| N1 | T1 | V1 |
| N1 | T2 | V2 |
| N1 | 空 | V3 |
| 氮气 | T2 | V4 |
| 氮气 | 空 | V5 |
| N3 | 空 | V6 |
-----------------------------------------

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

  • 第一级分组将按名称进行。
  • 在第二层,
    • 当可用类型为 T1、T2 和 NULL 时,将 T1 和 NULL 组合在一起,将 T2 单独组合在一起。
    • 当可用类型为 T2 和 NULL 时,将 NULL 与 T2 分组。
    • 当 NULL 是唯一可用的类型时,就保持原样。

上表的预期 O/P 为,

----------------------------
| N1 | T1 | V1+V3 |
| N1 | T2 | V2 |
| 氮气 | T2 | V4+V5 |
| N3 | 空 | V6 |
-----------------------------------------

如何在雪花 sql 中实现这一点。或任何其他服务器,以便我可以在 Snowflake 中找到等效的服务器。

4

1 回答 1

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我们可以转换NULLT1or 或T2

编辑:

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

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
于 2017-01-18T09:28:31.043 回答