1

テーブルを水平に回転させたい -

表は次のとおりです。

Master_Choicecode

ChoiceCode      MainCourseId    CourseLevelId    InstituteId

Master_MainCourse

MainCourseId     MainCourseName   CourseLevelId   CourseProgram
   11                x                1             abc
   12                y                2             xyz

Master_CourseLevel

CourseLevelId    CourseLevelName     
   1                deg
   2                Dip

Master_Institute

Instituteid     InstituteName    Statusid
    1001           Insti1          100
    1002           Insti2          200

Master_InstituteStatus

StatusId   StatusName
  100            Status1
  200            Status2

これらすべてのテーブルを使用して、これを表示したいと思います。

CourseProgram   CourseLevelName  Status1(from Master_InstituteStatus)     Status2(from Master_InstituteStatus)    
    abc             Deg          Count of institutes belonging to status1  Count of institutes belonging to status2

今、これは私が試したことです:

SELECT B.CourseProgram,C.CourseLevelName,
case when E.InstituteStatusName =' Status1' then COUNT(*) else null end as     Status1,
case when E.InstituteStatusName =' Status2' then COUNT(*) else null  end as  Status2,
FROM Master_ChoiceCode A 
inner join Master_MainCourse B on A.MainCourseID=B.MainCourseID
inner join Master_CourseLevel C on A.CourseLevelID=C.CourseLevelID  
inner join  Master_Institute D on A.InstituteID=D.InstituteID
inner join Master_InstituteStatus1 E on D.InstituteStatusID1=E.InstituteStatusID
where B.CourseLevelID IN(1,2)
GROUP BY B.CourseProgram,A.CourseLevelID,C.CourseLevelName,E.InstituteStatusName
order by B.CourseProgram,C.CourseLevelName;

しかし、これにより、次のような出力が得られます。

CourseProgram   CourseLevelName  Status1(from Master_InstituteStatus)     Status2(from Master_InstituteStatus)    
    abc             Deg          Count of institutes belonging to status1  
    abc             Deg                      Null                              Count of institutes belonging to status1

これに対する解決策はピボットを使用することです...しかし、現在のクエリでピボットを使用する方法がわかりません.助けてください..

4

2 に答える 2

1

SQL-Server で組み込みの PIVOT 関数を使用できます。

WITH CTE AS
(   SELECT  B.CourseProgram,
            C.CourseLevelName, 
            E.InstituteStatusName,
            b.CourseLevelID
    FROM    Master_ChoiceCode A 
            INNER JOIN Master_MainCourse B 
                ON A.MainCourseID=B.MainCourseID
            INNER JOIN Master_CourseLevel C 
                ON A.CourseLevelID=C.CourseLevelID  
            INNER JOIN  Master_Institute D 
                ON A.InstituteID=D.InstituteID
            INNER JOIN Master_InstituteStatus1 E 
                ON D.InstituteStatusID1=E.InstituteStatusID
    WHERE   B.CourseLevelID IN (1,2)
)
SELECT  CourseProgram, CourseLevelName, [Status1], [Status2]
FROM    CTE
        PIVOT
        (   COUNT(CourseLevelID)
            FOR InstituteStatusName IN ([Status1], [Status2])
        ) pvt

ORDER BY CourseProgram, CourseLevelName;
于 2012-08-30T07:58:17.003 に答える
1

近いですが、グループ化E.InstituteStatusNameすると、データを 1 つの行に結合できなくなります。caseステートメントを で使用するのではなくcount、条件付き合計を使用できます。

SELECT B.CourseProgram,C.CourseLevelName,
sum(case when E.InstituteStatusName =' Status1' then 1 else 0 end) as     Status1,
sum(case when E.InstituteStatusName =' Status2' then 1 else 0 end) as  Status2,
FROM Master_ChoiceCode A 
inner join Master_MainCourse B on A.MainCourseID=B.MainCourseID
inner join Master_CourseLevel C on A.CourseLevelID=C.CourseLevelID  
inner join  Master_Institute D on A.InstituteID=D.InstituteID
inner join Master_InstituteStatus1 E on D.InstituteStatusID1=E.InstituteStatusID
where B.CourseLevelID IN(1,2)
GROUP BY B.CourseProgram,A.CourseLevelID,C.CourseLevelName
order by B.CourseProgram,C.CourseLevelName;

これにより、そのフィールドでグループ化する必要なく、そのステータスに一致する行が効果的にカウントされます。

于 2012-08-30T07:07:40.960 に答える