出于商业原因,我有一个棘手的分组问题,我有一个像这样的值的表
---------------------------- | NAME | TYPE | VALUE | ---------------------------- | N1 | T1 | V1 | | N1 | T2 | V2 | | N1 | NULL | V3 | | N2 | T2 | V4 | | N2 | NULL | V5 | | N3 | NULL | V6 | -----------------------------
我需要以某种方式对其进行分组,
上表的预期O / P为,
---------------------------- | N1 | T1 | V1+V3 | | N1 | T2 | V2 | | N2 | T2 | V4+V5 | | N3 | NULL | V6 | -----------------------------
如何在雪花sql中实现这一点。或者任何其他服务器,这样我就可以在Snowflake中找到一个等价物。
答案 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
转换为T1
或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