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

Group rows having null value and a distinct value

我正在尝试对最后一列 (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

按年和月聚合,如果给定列没有非 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;

如果在 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;

我理解的逻辑是您只需要每列中的最小值:

SELECT YEAR, MONTHID, MONTH,
       MIN(C10) AS C10,
       ...,
       MIN(C22) AS C22,
       SUM(LEAVEDAYS) AS LEAVEDAYS
FROM t
GROUP BY YEAR, MONTHID, MONTH;