2013-03-06 97 views
0

我有一个相当复杂的报告,我试图编辑。以下是该报告的截图: enter image description here筛选出聚合行SSRS

我需要过滤掉所有行“号码不属于组”是N/A或0,我试图筛选出使用Tablix属性过滤器选项,但它不会让我由于错误: 聚合函数不能用于数据集过滤器。

下面是弥补了场“号码不属于组”表达式的代码:

=iif(sum(iif(left(Fields!crs_group.Value,1) = "G",1,0),"GrpCourse")=0, 
    "n/a", 
    sum(iif(Fields!crs_group.Value="Enrolled on Course",1,0)) - sum(iif(left(Fields!crs_group.Value,1) = "G",1,0))) 

我也试图在SQL查询中过滤掉那些行,但没有多少运气。下面是我尝试在查询中过滤掉行:

SELECT 
    sub.course , 
    sub.crs_group , 
    m.m_reference , 
    me.e_status , 
    me.e_id , 
    s.s_studentreference , 
    p.p_forenames , 
    p.p_surname , 
    pcd.p_surname + ',' + pcd.p_forenames AS course_dir , 
    ISNULL(COUNT(*) - SUM(CASE WHEN LEFT(crs_group, 1) = 'G' THEN 1 
          END), 1) AS NumberNotInGroups 
FROM 
    msql.unitesnapshot.dbo.capd_moduleenrolment AS me 
    INNER JOIN msql.unitesnapshot.dbo.capd_module AS m 
     ON me.e_module = m.m_id 
    LEFT JOIN msql.unitesnapshot.dbo.capd_staff scd 
     ON m.m_modulesupervisor = scd.s_id 
    LEFT JOIN msql.unitesnapshot.dbo.capd_person pcd 
     ON scd.s_id = pcd.p_id 
    INNER JOIN msql.unitesnapshot.dbo.capd_student s 
     ON me.e_student = s.s_id 
    INNER JOIN msql.unitesnapshot.dbo.capd_person p 
     ON s.s_id = p.p_id 
    INNER JOIN (
       SELECT 
        m.m_id , 
        CASE WHEN m.m_reference NOT LIKE '%G_' 
         THEN m.m_reference 
         ELSE LEFT(m.m_reference, 
            CHARINDEX('G', m.m_reference) - 1) 
        END AS course , 
        CASE WHEN m.m_reference NOT LIKE '%G_' 
         THEN 'Enrolled on Course' 
         ELSE RIGHT(m.m_reference, 2) 
        END AS crs_group 
       FROM 
        unitesnapshot.dbo.capd_module m 
       ) sub 
     ON sub.m_id = me.e_module 
WHERE 
    me.e_status = 'A' 
    AND LEFT(m.m_reference, 2) = '12' 
    AND SUBSTRING(m.m_reference, 7, 2) IN ('VF', 'AB', 'FB') 
GROUP BY 
    sub.course , 
    sub.crs_group , 
    m.m_reference , 
    me.e_status , 
    me.e_id , 
    s.s_studentreference , 
    p.p_forenames , 
    p.p_surname , 
    pcd.p_surname + ',' + pcd.p_forenames 
HAVING 
    COUNT(*) - SUM(CASE WHEN LEFT(crs_group, 1) = 'G' THEN 1 
         ELSE 0 
        END) <> 0 
ORDER BY 
    p.p_surname , 
    p.p_forenames 

然而,这并不工作,因为它包括将有N /在报告中的值的行。一个组由一个以G_结尾的课程代码来定义,但是某些课程没有组,所以这些课程显示为'n/a'。 对不起,如果没有任何意义,我真的需要一些帮助。

感谢

回答

1

我还没有完全了解你的查询,但好像你可以用一个公用表表达式(CTE)为此查询:

; 
WITH 
CourseIsGroupCourse 
AS 
(
    SELECT 
     m.m_id , 
     CASE WHEN m.m_reference NOT LIKE '%G_' 
      THEN m.m_reference 
      ELSE LEFT(m.m_reference, 
        CHARINDEX('G', m.m_reference) - 1) 
     END AS course , 
     SUM(...[Something I haven't figured out yet...]) as IsGroupCourse 
    FROM 
     unitesnapshot.dbo.capd_module m 
    GROUP BY 
     m.m_id, 
     CASE WHEN m.m_reference NOT LIKE '%G_' 
      THEN m.m_reference 
      ELSE LEFT(m.m_reference, 
        CHARINDEX('G', m.m_reference) - 1) 
     END 
) 
[Now back to your big query...] 

SELECT 
    sub.course , 
    sub.crs_group , 
    m.m_reference , 
    ... 
FROM 
    msql.unitesnapshot.dbo.capd_moduleenrolment AS me 
    INNER JOIN msql.unitesnapshot.dbo.capd_module AS m 
     ON me.e_module = m.m_id 
    LEFT JOIN 
... 
WHERE 
    me.e_status = 'A' 
    AND LEFT(m.m_reference, 2) = '12' 
    AND SUBSTRING(m.m_reference, 7, 2) IN ('VF', 'AB', 'FB') 
-- Here's the key bit... 
    AND sub.course in (SELECT course FROM CourseIsGroupCourse where IsGroupCourse = 1) 

(当使用SQL挣扎问题,我发现它通常有助于给名称命名更具描述性的名称,然后你就可以开始看到你在什么地方,并适当地将它们组合在一起。)