0

編集しようとしているかなり複雑なレポートがあります。以下は、レポートのスクリーンショットです。 ここに画像の説明を入力してください

「グループにない番号」がn/aまたは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クエリでこれらの行を除外しようとしましたが、あまりうまくいきませんでした。以下は、クエリ内の行を除外するための私の試みです。

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 / a値を持つ行が含まれているため、これは機能しません。グループはG_で終わるコースコードによって定義されますが、一部のコースにはグループがないため、これらは「n/a」と表示されます。申し訳ありませんが、これが意味をなさない場合は、本当に助けが必要です。

ありがとう

4

1 に答える 1

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の問題に苦しんでいるときは、よりわかりやすい名前でテーブルに名前を付けると役立つことがよくあります。そうすれば、どこに何があるのか​​を確認し、適切につなぎ合わせることができます。)

于 2013-03-06T15:08:28.947 に答える