WITH t_summary AS (
SELECT empid, result, t_date
, SUM(CASE WHEN t_date >= sysdate-5 THEN 1 ELSE 0 END) AS test_01
, SUM(CASE WHEN t_date >= sysdate-30 THEN 1 ELSE 0 END) AS test_02
, SUM(CASE WHEN t_date < sysdate-15 AND t_date >= sysdate-30 THEN 1 ELSE 0 END) AS test_03
FROM employees
WHERE result IN ('TRUE')
AND t_date >= sysdate-30
GROUP BY empid, result, t_date
)
SELECT empid, result, t_date
FROM t_summary
/* I should have a logic to define t_date (date type) associated with test_01 and test_03 at least.
if test_01 > 0 AND test_02 = 0, MAX(test_01.t_date)
else if test_01 > 0 AND test_03 > 0, MIN(test_03.t_date)
*/
WHERE t_date = (CASE WHEN test_01 > 0 AND test_02=0 THEN test_01.t_date
...
ELSE NULL
END)
;我还不能完成这项工作。如何与test_01、test_02和test_03一起指定日期?
发布于 2022-07-08 18:53:05
这将永远不会匹配任何行。
在WITH子句中,有一个过滤器:
WHERE t_date >= sysdate-30然后在SELECT中有:
SUM(CASE WHEN t_date >= sysdate-30 THEN 1 ELSE 0 END) AS test_02由于WHERE子句将筛选出那里的任何行,t_date < SYSDATE-30,那么CASE表达式将始终为true,因此您可以有效地使用:
SUM(1) AS test_02总能给你一个积极的价值。
最后,在外部查询中,您有:
WHERE t_date = (CASE
WHEN test_01 > 0 AND test_02=0
THEN test_01.t_date
ELSE NULL
END)因为,一个组必须有一个匹配行才能存在,所以test_02必须是非零的,因此CASE表达式将永远不会匹配该WHEN子句,并且您正在筛选WHERE t_date = NULL,而且由于NULL永远不等于任何东西,那么您的查询就永远不会匹配一行。
(忽略test_01.t_date是无效语法的事实,因为您没有使用标识符test_01__声明表或表别名。)
https://stackoverflow.com/questions/72915639
复制相似问题