2013-12-10 40 views
2

我有一个查询,列出尚未通过评估的人员,并且希望添加一列以显示他们是否尝试过。如果他们没有尝试过,则该字段为null,如果他们尝试过,则显示failed。我已经从相关的评估表中看到了这一点,但是当一个人有failed时,它也会在状态栏中显示另一行没有任何内容(这是因为他们可以通过2门课程之一,所以可能会有一个失败的记录,而没有访问另一个记录)。我在我的主要查询中使用了select distinct。我明白为什么我不能在某些列上使用distinct,因为它不知道要显示哪些记录。SQL选择不同的决定要保留哪个记录

是否有任何方法可以使用SQL或Visual Studio中的表达式来合并这两个,确保failed状态保留?它只需要为了本报告的利益而完成,因此它是否在Visual Studio中无关紧要。

ID firstname surname lessonstatus 
------------------------------------------ 
27 joe   bloggs  
47 mickey  mouse 
47 mickey  mouse  Failed 

我想什么它显示如下:

ID firstname surname lessonstatus 
------------------------------------------ 
27 joe   bloggs  
47 mickey  mouse  Failed 

在数据库米老鼠是在数据库两次,一次为每个两门课程,但对于这个报告的目的我不需要显示课程,我只需要在列表中显示他们的名字,因为没有通过任何一个。如果他们失败了,我想保留Failed条目作为一个迹象,表明他们已经尝试了两门课程中的一门或另一门

+3

请提供模式,样本数据,以及所需的输出。 – RedFilter

回答

1

很难不表布局回答,但假设你与stame结构评估表,这应该做的伎俩:

SELECT ID, firstname, surname, MAX(lessonstatus) FROM(
    SELECT * FROM assessment1 
    UNION 
    SELECT * FROM assessment2 
) GROUP BY ID, firstname, surname 
+0

非常感谢您的答复。在我的情况下,为了其他人的利益,他们在同一个表中,如果结果在同一个表中,则可以更改上述内容,以便他们都从同一个“评估”表中选择,但使用“where”选择两次评估。实际上,对于我现有的查询,我所需要做的只是'MAX(lessonstatus)',然后是'GROUP BY',而我的'select'语句中的其他字段 – laurencemadill

0

这样的事情将提供您所需要的东西。

select p.name 
, coalesce(a.value, 'no attempt') result 
from person p left join assessment a on a.personId = p.personID 
and a.value <> 'pass' 
etc 

你当然需要自己的表名。此外,评估表上的所有过滤都必须在from子句中完成。如果您在where子句中尝试它,则联接将变为内联。

+0

感谢您的建议,这似乎没有省略第二次发生的人 – laurencemadill