2011-02-17 69 views
4
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; 

任何想法,为什么我不断收到此错误:错误报告:的Oracle SQL - 帮助使用案例在SELECT语句

SQL Error: ORA-00904: "DAYS_EXPERIENCE": invalid identifier 00904. 00000 - "%s: invalid identifier" *Cause:
*Action:

回答

9

不能在WHERE子句中引用一个别名。要么使用子查询,要么只使用整个CASE...END到where子句中。每个操作的评论

更新查询:

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; 
+0

与您的代码,我得到一个指向WHERE子句中的错误:SQL错误:ORA-00934:组功能在这里不允许使用 00934. 00000 - “此处不允许使用组功能” – AME 2011-02-17 04:24:14

+1

@ame由于它使用聚合函数,它属于`HAVING`子句。更新我的代码。 – 2011-02-17 04:25:56

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; 
2

下面是问题的查询直接简化,取MAX(任意行)对MIN(任意行)。 The Scrum Meister's answer也修正了OP的逻辑,以正确地处理作业之间的差距。


这应该是你所需要的。让student_schools表加入似乎不会增加任何值,除非存在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 
  • 的NVL采取与SYSDATE

更换一个不存在的END_DATE的护理如果你需要验证student_schools - 只需添加一个INNER JOIN它。没有其他地方需要。

0

对于短和更可读的代码,使用一个外选择:

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;