2013-02-22 63 views
0

我試圖修改報表,我需要排除基於在一列中的數據該列的表達式是行數:轉換報表服務表達對SQL

=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我可以過濾掉查詢中的那些行。到目前爲止我的代碼是:

CASE WHEN SUM(CASE WHEN LEFT(sub.crs_group, 1) = 'G' 
THEN 1 ELSE 0 END)=0 THEN 999999999 
ELSE SUM(CASE WHEN sub.crs_group = 'Enrolled on Course' 
THEN 1 ELSE 0 END) - SUM(CASE WHEN LEFT(sub.crs_group,1) = 'G' 
THEN 1 ELSE 0 END) 
END AS NumberNotInGroups 

然而,這並沒有給匹配結果在運行報表時。我已將「n/a」更改爲999999999,因爲我從VARCHAR轉換爲INT錯誤。我已經嘗試轉換成VARCHAR沒有成功。任何幫助將不勝感激,昨天整個下午花費在試圖弄清楚。

編輯

下面是完整的查詢:

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, 
CASE WHEN SUM(CASE WHEN LEFT(sub.crs_group, 1) = 'G' THEN 1 ELSE 0 END)=0 THEN 999999999 
    ELSE SUM(CASE WHEN sub.crs_group = 'Enrolled on Course' THEN 1 ELSE 0 END) - SUM(CASE WHEN LEFT(sub.crs_group,1) = 'G' THEN 1 ELSE 0 END) 
END 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 

ORDER BY 
p.p_surname 

這是正確的結果在SSRS:

enter image description here

這裏是不正確的結果在SQL服務器,它應該顯示1不是99999999:

enter image description here

+2

對SSRS沒有任何線索,但是當我搜索SUM()函數時,第二個參數是「scope」。可能吧,這會轉化爲「GROUP BY」子句?你有'GROUP BY'條款嗎?請發佈整個查詢。 – fancyPants 2013-02-22 10:06:23

+0

另外,這裏有幾行數據集和預期結果會非常有幫助。 – 2013-02-22 10:28:04

回答

1

您可能需要更好地解釋問題並顯示更多的查詢細節。看起來你正在試圖展示那些不在團隊中的人蔘加的課程。但是,您使用相同的字段crs_Group來顯示它們是否只是註冊或者它們是否在一個組中。現在,如果crs_Group等於「註冊課程」,但當他們加入一個組時,變爲以G開頭的某個事物,那麼當課程中有更多人成羣時,您的等式應該爲負數。

因此,也許這將是更好地計算每個人都參加了一個課程較少的那些人以羣與人在球場上而不是在小組結束了:

SELECT CourseName, 
    COUNT(*) - SUM(CASE WHEN LEFT(crs_group, 1) = 'G' THEN 1 END) AS NumberNotInGroups 
FROM Courses 
GROUP BY CourseName 
HAVING COUNT(*) - SUM(CASE WHEN LEFT(crs_group, 1) = 'G' THEN 1 ELSE 0 END) <> 0 

此查詢篩選出的課程,每個人都是在一個組中。

+0

謝謝,我認爲這樣做會有效 – Will 2013-02-22 11:19:43