2016-11-04 70 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