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

硕士_研究所

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

您已经接近了,但是分组E.InstituteStatusName意味着您将无法将数据组合到一行中。您可以使用条件总和,而不是使用case带有 a 的语句。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 回答
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 回答