sql - 复杂的枢轴

标签 sql pivot

我已将复杂模式简化为以下示例

Students


  • StudentID int, Name varchar(50)
  • 1、比尔
  • 2、艾米
  • 3、贝丝
  • 4、斯科特
  • 5、史蒂夫

  • Classes


  • ClassID int, Name varchar(50), Period varchar(50)
  • 1,代数,Period1
  • 2、地理、期3
  • 3、生物学、第5期
  • 4、物理、Period4
  • 5、演讲、Period2
  • 6、历史、期6

  • 和一个接线 table

    StudentsClasses


  • StudentID int, ClassID int
  • 1, 1
  • 1、4
  • 1, 5
  • 2、6
  • 3、5
  • 3、4
  • 3、6
  • 4、1
  • 4、4
  • 5、5
  • 5、6

  • 我的目标是列出每个学生,并按周期顺序列出他们选择的类(class)。我有以下选择
    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
    

    我需要帮助的地方是我需要将所有非空值移向左列,以便没有空格。列名可以重命名,例如
    Name   Choice1   Choice2   Choice3   Choice4   Choice5   Choice6
    ------ --------- --------- --------- --------- --------- ----------
    Amy    History
    Beth   Speech    Physics   History
    Bill   Algebra   Speech    Physics
    Scott  Algebra   Physics
    Steve  Speech    History
    

    我可以通过将数据透视表选择到临时表中,然后用游标遍历每一行/列来做到这一点,但我想避免这种情况。任何建议都非常感谢。

    最佳答案

    假设 SQL Server 2005(至少),使用 ROW_NUMBER()订购选择:

    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
    

    关于sql - 复杂的枢轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6194100/

    相关文章:

    sql - 多键索引的性能和使用

    sql - 如何在单个查询中使用 count ,'like' 和 group by?

    python - 如何解决 'The column label ' Avg_Threat_Score' is not unique.'? Pandas 问题

    python - 如何对一列使用透视/分组并连接其他列?

    sql-server - 枢轴的替代方案

    mysql - 使用 MySQL 的数据透视表

    sql - NOT EXISTS with NULLs 与其他运算符不一致

    mysql - SQL 存储过程 : If statement not behaving as expected

    MySQL - 在自定义列上创建搜索

    sql - 如何获取数据透视表每行的最大列数和最小列数?