对具有空值和不同值的行进行分组
Posted
技术标签:
【中文标题】对具有空值和不同值的行进行分组【英文标题】:Group rows having null value and a distinct value 【发布时间】:2020-06-27 06:03:39 【问题描述】:我正在尝试对最后一列 (LeaveDays) 求和,并需要通过对所有列进行分组来将输出放在一行中,但我无法在此处对行进行分组,并获得相同的未分组结果。 谢谢!
我需要输出为:
YEAR MONTHID MONTH C10 C11 C12 C13 C14 C15 C16 C17 C18 C19 C20 C21 C22 LEAVEDAYS
2020 6 JUNE P P P P H P P P P A P H A 4
【问题讨论】:
【参考方案1】:如果在 C10 到 C22 中找到除 P 之外的其他字符,则将其他字符纳入结果。
我认为您可以将max
与keep
子句一起使用,如下所示:
SELECT
YEAR, MONTHID, MONTH,
MAX(C10) KEEP(DENSE_RANK LAST ORDER BY CASE WHEN C10='P' THEN 1 ELSE 2 END) AS C10,
...,
MAX(C22) KEEP(DENSE_RANK LAST ORDER BY CASE WHEN C22='P' THEN 1 ELSE 2 END) AS C22,
SUM(LEAVEDAYS) AS LEAVEDAYS
FROM your_table
GROUP BY
YEAR, MONTHID, MONTH;
或者你可以使用条件聚合如下:
SELECT
YEAR, MONTHID, MONTH,
COALESCE(MAX(CASE WHEN C10<>'P' THEN C10 END),'P') AS C10,
...,
COALESCE(MAX(CASE WHEN C22<>'P' THEN C22 END),'P') AS C22,
SUM(LEAVEDAYS) AS LEAVEDAYS
FROM your_table
GROUP BY
YEAR, MONTHID, MONTH;
【讨论】:
谢谢!这在我的情况下真的很有效。我为我的解决方案使用了第二个选项。非常感谢。【参考方案2】:按年和月聚合,如果给定列没有非NULL
值,则使用COALESCE
显示P
:
SELECT
YEAR,
MONTHID,
MONTH,
COALESCE(MAX(C10), 'P') AS C10,
COALESCE(MAX(C11), 'P') AS C11,
...,
COALESCE(MAX(C22), 'P') AS C22,
SUM(LEAVEDAYS) AS LEAVEDAYS
FROM yourTable
GROUP BY
YEAR,
MONTHID,
MONTH;
【讨论】:
我没有问题将'P'代替null。我需要将所有行组合成一行。谢谢。 我的回答应该正是这样做的。如果不是,那我的回答是做什么的?【参考方案3】:我理解的逻辑是您只需要每列中的最小值:
SELECT YEAR, MONTHID, MONTH,
MIN(C10) AS C10,
...,
MIN(C22) AS C22,
SUM(LEAVEDAYS) AS LEAVEDAYS
FROM t
GROUP BY YEAR, MONTHID, MONTH;
【讨论】:
以上是关于对具有空值和不同值的行进行分组的主要内容,如果未能解决你的问题,请参考以下文章