复杂的轴心

| 我将复杂的架构简化为以下示例   学生们 StudentID int,名称varchar(50) 1,比尔 2,艾米 3,贝丝 4,斯科特 5,史蒂夫   班级 ClassID int,名称varchar(50),句点varchar(50) 1,代数,期间1 2,地理位置,期间3 3,生物学,期间5 4,物理,期间4 5,演讲,期间2 6,历史,时期6 和一个联结表   学生班 StudentID int,ClassID int 1、1 一四 1、5 2 6 3 5 3 4 3、6 4、1 4、4 5、5 5、6 我的目标是按照时间顺序列出每个学生及其所选课程。我有以下选择
SELECT Name,Period1, Period2, Period3, 
    Period4, Period5, Period6  
    FROM (
SELECT _Students.Name AS [NAME],_Classes.Period AS PIVOT_CODE, _Classes.name as [Class] 
FROM _Classes 
    INNER JOIN _StudentsClasses ON _Classes.ClassID=_StudentsClasses.ClassID 
    INNER JOIN _Students ON _StudentsClasses.StudentID=_Students.StudentID
)
    AS data
    PIVOT 
    (  min([Class])  FOR [PIVOT_CODE] IN 
        (Period1, Period2, Period3, 
    Period4, Period5, Period6)
    ) AS pvt
导致
Name   Period1   Period2   Period3   Period4   Period5   Period6
------ --------- --------- --------- --------- --------- ----------
Amy    NULL      NULL      NULL      NULL      NULL      History
Beth   NULL      Speech    NULL      Physics   NULL      History
Bill   Algebra   Speech    NULL      Physics   NULL      NULL
Scott  Algebra   NULL      NULL      Physics   NULL      NULL
Steve  NULL      Speech    NULL      NULL      NULL      History
我需要帮助的地方是将所有非null移到左列,因此没有空格。列名可以重命名,例如
Name   Choice1   Choice2   Choice3   Choice4   Choice5   Choice6
------ --------- --------- --------- --------- --------- ----------
Amy    History
Beth   Speech    Physics   History
Bill   Algebra   Speech    Physics
Scott  Algebra   Physics
Steve  Speech    History
我可以通过选择到临时表的数据透视表然后使用游标遍历每一行/列来做到这一点,但我想避免这种情况。任何建议,不胜感激。     
已邀请:

bab

        假设(至少)SQL Server 2005,使用3排序选择:
SELECT Name, Choice1, Choice2, Choice3, Choice4, Choice5, Choice6  
FROM (
    SELECT 
        S.Name AS [NAME], 
        \'Choice\' + CAST(ROW_NUMBER() OVER(PARTITION BY S.Name ORDER BY S.Name, C.Period) AS VARCHAR) AS PIVOT_CODE, 
         C.Name as [Class]
    FROM Classes C
        JOIN StudentsClasses SC ON C.ClassID = SC.ClassID 
        JOIN Students S ON SC.StudentID = S.StudentID
    )
    AS data
    PIVOT 
    (  min([Class])  FOR [PIVOT_CODE] IN 
        (Choice1, Choice2, Choice3, Choice4, Choice5, Choice6)
    ) AS pvt
    

要回复问题请先登录注册