对具有空值和不同值的行进行分组

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 之外的其他字符,则将其他字符纳入结果。

我认为您可以将maxkeep 子句一起使用,如下所示:

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;

【讨论】:

以上是关于对具有空值和不同值的行进行分组的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 按空值和非空值分组

具有未定义和空值的排序对象数组

如何将SAS数据集中全部为空值的变量删除

删除同一列或连续行的另一列中具有特定值和缺失值的行

Pandas GroupBy 并选择特定列中具有最小值的行

如何在 Laravel 中提交具有空白或空值和非空白值的表单