对具有空值和不同值的行进行分组
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 之外的其他字符,则您将该其他字符带入结果。
我认为您可以将 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;
我理解的逻辑是您只需要每列中的最小值:
SELECT YEAR, MONTHID, MONTH,
MIN(C10) AS C10,
...,
MIN(C22) AS C22,
SUM(LEAVEDAYS) AS LEAVEDAYS
FROM t
GROUP BY YEAR, MONTHID, MONTH;
我正在尝试对最后一列 (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 之外的其他字符,则您将该其他字符带入结果。
我认为您可以将 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;
我理解的逻辑是您只需要每列中的最小值:
SELECT YEAR, MONTHID, MONTH,
MIN(C10) AS C10,
...,
MIN(C22) AS C22,
SUM(LEAVEDAYS) AS LEAVEDAYS
FROM t
GROUP BY YEAR, MONTHID, MONTH;