2011-02-17 29 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;