我试图将行数据的总和放入列中,但无法使其工作。 这将返回 60 行,其中三列中每一行的总和正确(下图)。返回的所有其他值均为 NULL:
SELECT
CASE WHEN f.month_period = 'January' AND f.year_period = 2023 THEN SUM(CASE WHEN e.status='A' THEN 1 ELSE 0 END) END 'January 2023 Count',
CASE WHEN f.month_period = 'February' AND f.year_period = 2023 THEN SUM(CASE WHEN e.status='A' THEN 1 ELSE 0 END) END 'February 2023 Count',
CASE WHEN f.month_period = 'March' AND f.year_period = 2023 THEN SUM(CASE WHEN e.status='A' THEN 1 ELSE 0 END) END 'March 2023 Count' --etc.
FROM employees e
JOIN file_load f ON f.guid = e.guid
GROUP BY e.guid, f.month_period, f.year_period
结果:
但是如果我尝试这样做,我会得到我正在寻找的单行,但显然只有“一月”列中有总和数据:
SELECT
CASE WHEN f.month_period = 'January' AND f.year_period = 2023 THEN SUM(CASE WHEN e.status='A' THEN 1 ELSE 0 END) END 'January 2023 Count',
CASE WHEN f.month_period = 'February' AND f.year_period = 2023 THEN SUM(CASE WHEN e.status='A' THEN 1 ELSE 0 END) END 'February 2023 Count',
CASE WHEN f.month_period = 'March' AND f.year_period = 2023 THEN SUM(CASE WHEN e.status='A' THEN 1 ELSE 0 END) END 'March 2023 Count' --etc.
FROM employees e
JOIN file_load f ON f.guid = e.guid
WHERE f.month_period = 'January' AND f.year_period = 2023
GROUP BY e.guid, f.month_period, f.year_period
结果:
我还没有找到任何方法在 CASE WHEN 表达式“内”添加 WHERE 子句或 GROUP BY。
您不能有条件地使用聚合函数。在这种情况下,您只需在整个逻辑中使用单个 SUM 即可。
稍微绕道...不推荐使用字符串文字作为列别名。将列名称括在方括号中,或者更好的是,将格式保留在前端,并从列名称中删除空格等。
SELECT
SUM(CASE WHEN f.month_period = 'January' AND f.year_period = 2023 and e.status='A' THEN 1 ELSE 0 END) 'January 2023 Count',
SUM(CASE WHEN f.month_period = 'February' AND f.year_period = 2023 and e.status='A' THEN 1 ELSE 0 END) 'February 2023 Count',
SUM(CASE WHEN f.month_period = 'March' AND f.year_period = 2023 and e.status='A' THEN 1 ELSE 0 END) 'March 2023 Count' --etc.
FROM employees e
JOIN file_load f ON f.guid = e.guid
WHERE f.month_period = 'January' AND f.year_period = 2023
GROUP BY e.guid, f.month_period, f.year_period