SQL Server/Report Builder子查询返回多行错误

SQL Server/Report Builder子查询返回多行错误,sql,sql-server,ssrs-2012,reportbuilder3.0,Sql,Sql Server,Ssrs 2012,Reportbuilder3.0,我很难理解为什么报表生成器中的子查询返回多行 ( SELECT ( CASE WHEN C.CourseCode IN ('50089079','50089080') THEN 'L2 Maths FS' WHEN C.CourseCode IN ('50089067','50089109') THEN 'L1 Maths FS' WHEN C.CourseCode IN ('5008498

我很难理解为什么报表生成器中的子查询返回多行

(
    SELECT 
    (
        CASE
            WHEN C.CourseCode IN ('50089079','50089080') THEN 'L2 Maths FS'
            WHEN C.CourseCode IN ('50089067','50089109') THEN 'L1 Maths FS'
            WHEN C.CourseCode IN ('50084987','50092959') THEN 'E3 Maths FS'
            WHEN C.CourseCode IN ('50084975','50091967') THEN 'E2 Maths FS'
            WHEN C.CourseCode IN ('50084963','50091724') THEN 'E1 Maths FS'
            WHEN C.CourseCode IN ('60146084') THEN 'GCSE Maths'
            Else 'NA'
        END
    )
    FROM
        Enrolment E
    INNER JOIN 
        Course C ON C.CourseID = E.CourseID
    WHERE 
        E.PMStudentID = vReports_Enrolment.PMStudentID
        AND C.CourseCode IN ('50089079', '50089080', '50089067', '50089109', '50084987', '50092959', '50084975', '50091967', '50084963', '50091724', '60146084')
        AND vReports_Enrolment.CompletionID = 1
) 
这是出现此错误的特定学习者的数据-我强调了如果不检查CompletionID以查看其是否为“1”,通常会返回2行:

CourseCode  CompletionID  
-------------------------
50044357    1 
50044369    1
50089079    0   
60146084    1
60187578    1
60148366    1
本例中的预期行为是返回“GCSE数学”-我做错什么了吗?

补充:

(
    SELECT TOP 1
    (
        CASE

确保只返回一行,这是预期的行为

在某些情况下,您有两行或更多行

使用TOP 1只会选择第一个,这并不能保证它是您想要的,特别是如果您的数据没有您想象的那么干净


使用
选择DISTINCT…
更安全。这样,如果所有返回的行都相同,只是重复,那么您将得到正确的答案。如果仍然出现错误,则需要调查子查询结果。

您发布的当前输出与位于其上方的查询不直接对应。你能编辑你的问题吗?关于你的错误,这是不言自明的。您在select子句中有一个子查询,它返回多个记录/值,这是没有意义的。整个查询非常庞大,只有这一部分被忽略了。如果CourseCode在指定的范围内,并且其CompletionID为1,那么它将返回正好1个值。我们需要查看整个查询。是的,select子句中的单个
CASE
表达式不应触发此错误,这就是为什么这可能不是问题的原因。只是将
TOP 1
添加到select子句中。。。似乎有用-耸耸肩-