0

レポートを変更しようとしていて、ある列のデータに基づいていくつかの行を除外する必要があります。その列の式は次のとおりです。

=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

ただし、これはレポートの実行時に一致する結果を提供しません。VARCHAR から INT エラーへの変換が発生するため、「n/a」を 999999999 に変更しました。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 での正しい結果は次のとおりです。

ここに画像の説明を入力

そして、これは sql-server の誤った結果です。99999999 ではなく 1 と表示されるはずです。

ここに画像の説明を入力

4

1 に答える 1

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

このクエリは、全員がグループに属しているコースを除外します。

于 2013-02-22T10:46:12.320 に答える