2016-11-04 113 views
1

我正在使用課程目錄表,其中提供了課程提供時的目錄代碼和課程代碼。我需要做的是確定何時不再提供課程並將其標記爲存檔課程。比較同一表中的數據 - SQL

CREATE TABLE [dbo].[COURSECATALOG](
    [catalog_code] [char](6) NOT NULL, 
    [course_code] [char](7) NOT NULL, 
    [title] [char](40) NOT NULL, 
    [credits] [decimal](7, 4) NULL, 

) 

insert into coursecatalog 
values 
('200810', 'BIOL101', 'Biology', '3'), 
('200810', 'CHEM201', 'Advanced Chemistry', '3'), 
('200810', 'ACCT101', 'Beginning Accounting', '3'), 
('201012', 'ACCT101', 'Beginning Accounting', '3'), 
('201214', 'ACCT101', 'Beginning Accounting', '3'), 
('201214', 'ENGL101', 'English Composition', '3'), 
('201416', 'PSYC101', 'Psychology', '3'), 
('201618', 'PSYC101', 'Psychology', '3'), 
('201618', 'BIOL101', 'Biology', '3'), 
('201618', 'CHEM201', 'Advanced Chemistry', '3'), 
('201618', 'ENGL101', 'English Composition', '3'), 
('201618', 'PSYC101', 'Psychology', '3') 

在這種情況下,我需要返回ACCT101 - 開始的會計,因爲這是不提供了,應該被視爲歸檔過程。

我迄今爲止代碼:

SELECT 
catalog_code, course_code 
FROM COURSECATALOG t1 
WHERE NOT EXISTS (SELECT 1 
        FROM COURSECATALOG t2 
        WHERE t2.catalog_code <> t1.catalog_code 
        AND t2.course_code = t1.course_code) 
order by 
course_code, catalog_code 

但是,只提供過一次(在一個目錄下)這只是回報的課程。我需要弄清楚我可以如何獲得可能在多個目錄中提供的課程,但不再提供。

任何可以提供的援助表示讚賞!

謝謝!

+0

只是好奇。您如何知道ACCT101來自舊目錄,而不是當前目錄中的新類?看來也許「當前」目錄是catalog_code的最大值?更規範的結構將使這更容易。添加一個目錄表會使這個模糊不清。我真的希望這些教授會用更好的例子來表達他們給學生的東西。 –

+0

我正在基於目錄代碼。例如,201618是一個涵蓋2016 - 2018年的目錄。我不確定這個目錄是否真的很重要,因爲我需要任何不再提供的課程? – RAR

+0

沒錯。但是我問你如何知道目錄是什麼。並指出這裏的數據含糊不清。如果你不需要知道什麼是當前目錄(或最近的),你無法知道什麼課程是新的,什麼課程已經退役。 –

回答

1

我覺得catalog_code是YYYYMM格式的日期

SELECT course_code FROM (
SELECT CONVERT(char, catalog_code,112) AS catalog_code, course_code FROM COURSECATALOG 
) AS Q 
GROUP BY course_code 
HAVING MAX(catalog_code) < '20160101' 

例子: http://sqlfiddle.com/#!6/32adfb/14/1

+0

謝謝,我認爲這對我很有用!非常感激! – RAR

0

你想是這樣的:

SELECT course_code 
FROM COURSECATALOG t1 
GROUP BY course_code 
HAVING MAX(catalog_code) <> '201618'; 

這假定「目前提供」意味着它是在201618目錄。

你可以計算出最新的目錄:

SELECT course_code 
FROM COURSECATALOG t1 
GROUP BY course_code 
HAVING MAX(catalog_code) <> (SELECT MAX(catalog_code FROM COURSECATALOG); 
+0

謝謝Gordon,爲您提供幫助。非常感謝! – RAR