CREATE TABLE student_totalexp2 nologging compress AS
SELECT /*+parallel(a,4)*/ DISTINCT a.member_sk,
CASE
WHEN b.end_date IS NULL THEN
SYSDATE - MIN(TO_DATE(b.start_date,'yyyymm'))
ELSE
(MAX(TO_DATE(b.end_date,'yyyymm')) - MIN(TO_DATE(b.start_date,'yyyymm')))
END as days_experience
FROM student_schools a
JOIN rdorwart.position_rd b ON a.member_sk = b.member_sk
WHERE days_experience < 730
GROUP BY a.member_sk;
SELECT COUNT(*)
FROM student_experience;
知道我为什么一直收到此错误:错误报告:
SQL错误:ORA-00904:“DAYS_EXPERIENCE”:无效标识符00904. 00000 - “%s:无效标识符” *原因:
*操作:
答案 0 :(得分:9)
您无法在WHERE
子句中引用别名。使用子查询,或者更好地使用整个CASE...END
进入where子句。
根据OP的评论更新了查询:
create table student_totalexp2 nologging compress as
SELECT a.member_sk,
SUM(CASE WHEN b.end_date IS NULL
THEN sysdate
ELSE to_date(b.end_date,'yyyymm')
END - to_date(b.start_date,'yyyymm')) as days_experience
FROM student_schools a INNER JOIN rdorwart.position_rd b
ON a.member_sk = b.member_sk
GROUP BY a.member_sk
HAVING SUM(
CASE WHEN b.end_date IS NULL
THEN sysdate
ELSE to_date(b.end_date,'yyyymm')
END - to_date(b.start_date,'yyyymm')
) < 730;
SELECT COUNT(*) FROM student_experience;
答案 1 :(得分:2)
以下是对问题中查询的直接简化,将MAX(任意行)与MIN(任何行)相对应。 The Scrum Meister's answer也修复了OP的逻辑,以正确地解决作业之间的差距。
<小时/> 这应该是你所需要的。使student_schools表JOINed似乎没有添加任何值,除非有些情况下position_rd记录不存在student_schools
记录。
CREATE TABLE student_totalexp2 nologging compress AS
SELECT b.member_sk,
NVL(MAX(TO_DATE(b.end_date,'yyyymm')), SYSDATE)
- MIN(TO_DATE(b.start_date,'yyyymm')) as days_experience
FROM rdorwart.position_rd b
GROUP BY b.member_sk
HAVING NVL(MAX(TO_DATE(b.end_date,'yyyymm')), SYSDATE)
- MIN(TO_DATE(b.start_date,'yyyymm')) < 730
如果您确实需要验证student_schools
- 只需添加一个INNER JOIN即可。其他任何地方都不需要。
答案 2 :(得分:0)
你不能直接在where子句中使用该字段的guiven名称。您需要重复where子句
中的逻辑select /*+parallel(a,4)*/ distinct a.member_sk,
CASE WHEN b.end_date is null
THEN sysdate - min(to_date(b.start_date,'yyyymm'))
ELSE (max(to_date(b.end_date,'yyyymm')) - min(to_date(b.start_date,'yyyymm')))
END as days_experience
from student_schools a INNER JOIN rdorwart.position_rd b
ON a.member_sk = b.member_sk
where (CASE WHEN b.end_date is null
THEN sysdate - min(to_date(b.start_date,'yyyymm'))
ELSE (max(to_date(b.end_date,'yyyymm')) - min(to_date(b.start_date,'yyyymm')))
END) < 730
group by a.member_sk;
select count(*) from student_experience;
答案 3 :(得分:0)
对于简短且易读的代码,请使用外部SELECT:
CREATE TABLE student_totalexp2 nologging compress AS
SELECT member_sk, days_experience FROM (
SELECT a.member_sk
, SUM(CASE WHEN b.end_date IS NULL
THEN sysdate ELSE to_date(b.end_date,'yyyymm') END
- to_date(b.start_date,'yyyymm')) AS days_experience
FROM student_schools a
INNER JOIN rdorwart.position_rd b ON a.member_sk = b.member_sk
GROUP BY a.member_sk)
WHERE days_experience < 730;
SELECT COUNT(*)
FROM student_experience;