【问题标题】:SQL Server Pivot Multiple TablesSQL Server 透视多个表
【发布时间】:2012-01-30 18:12:49
【问题描述】:

我们有以下表格:

表 1:Student_Records
学生 ID     |课程 ID     |期间     |等级
12                       6010               P1                90

   23                       6020               P1                 80

   12                       6030               P2                ''空白,没有成绩

   15                       6010                P1                 70

   12                      6020               P1                 80

   15                       6020               P1                 90

表 2:Course_Records
CourseID        CourseDec       学分
6010                   数学              3

   6020                   生物学            3

   6030                 英语            3

表 3:Student_Info
StudentID         FirstName         LastName         ClassYear
12                       乔                  史密斯               2013

15                                                         李              2013

23                      皮特                   Vo               2013


结果愿望:
ClassYear           姓氏          名字           StudentId           数学          生物学
2013 Smith Joe 12 90 80

2013 Li Chak 15 70 90

如何使用 pivot 命令实现这个结果?

【问题讨论】:

  • 输出中不包含 Pete Vo 的任何原因?为什么不包括英文?
  • 我没有包括 Pete Vo,因为我只是想大致了解我想要实现的目标。我有至少 200 多名学生,每期至少选修八门课程。

标签: sql sql-server pivot


【解决方案1】:

您可以为此使用 PIVOT,但它要求您知道自己感兴趣的课程描述。

SELECT p.classyear, 
       p.lastname, 
       p.firstname, 
       p.studentid, 
       pvt.math, 
       pvt.biology 
FROM   (SELECT sr.grade, 
               si.classyear, 
               si.studentid, 
               si.firstname, 
               silastname 
        FROM   student_info si 
               INNER JOIN student_records sr 
                 ON si.studentid = sr.studentid 
               INNER JOIN course_records cr 
                 ON sr.courseid = cr.courseid) p PIVOT ( AVG (grade) FOR 
       coursedec IN ( 
       [Math], [Biology]) ) AS pvt 
ORDER  BY pvt.classyear; 

【讨论】:

  • 哇,每个学生在第一期都选修了相同的 13 门课程,但在最后两期他们将选修不同的课程……谢谢您的回复。 :)
【解决方案2】:

通过连接查询出数字和课程,以便您最终得到

StudentID CourseDec Grade
1         Math      20
1         Woodwork  82

你最终得到的枢轴

StudentID Math WoodWork
1         20   82

然后加入 Back to student 以获取 First Name Alst Name 等。

【讨论】:

    【解决方案3】:

    https://data.stackexchange.com/stackoverflow/query/60493/http-stackoverflow-com-questions-9068600-sql-server-pivot-mulitple-tables

    DECLARE @Student_Records AS TABLE (
      studentid INT,
      courseid  INT,
      period    VARCHAR(2),
      grade     INT);
    
    INSERT INTO @Student_Records
    VALUES      (12,
                 6010,
                 'P1',
                 90),
                (23,
                 6020,
                 'P1',
                 80),
                (12,
                 6030,
                 'P2',
                 NULL),
                (15,
                 6010,
                 'P1',
                 70),
                (12,
                 6020,
                 'P1',
                 80),
                (15,
                 6020,
                 'P1',
                 90);
    
    DECLARE @Course_Records AS TABLE (
      courseid  INT,
      coursedec VARCHAR(50),
      credits   INT);
    
    INSERT INTO @Course_Records
    VALUES      ( 6010,
                  'Math',
                  3),
                ( 6020,
                  'Biology',
                  3),
                ( 6030,
                  'English',
                  3);
    
    DECLARE @Student_Info AS TABLE (
      studentid INT,
      firstname VARCHAR(50),
      lastname  VARCHAR(50),
      classyear INT);
    
    INSERT INTO @Student_Info
    VALUES      (12,
                 'Joe',
                 'Smith',
                 2013),
                (15,
                 'Chak',
                 'Li',
                 2013),
                (23,
                 'Pete',
                 'Vo',
                 2013);
    
    SELECT DISTINCT coursedec
    FROM   @Course_Records AS cr
           INNER JOIN @Student_Records sr
             ON sr.courseid = cr.courseid
    WHERE  sr.grade IS NOT NULL;
    
    SELECT classyear,
           lastname,
           firstname,
           summary.studentid,
           summary.math,
           summary.biology
    FROM   (SELECT *
            FROM   (SELECT si.studentid,
                           coursedec,
                           grade
                    FROM   @Course_Records AS cr
                           INNER JOIN @Student_Records sr
                             ON sr.courseid = cr.courseid
                           INNER JOIN @Student_Info si
                             ON si.studentid = sr.studentid
                    WHERE  sr.grade IS NOT NULL) AS results PIVOT (AVG(grade) FOR
                   coursedec
                   IN (
                   [Math], [Biology])) AS pvt) AS summary
           INNER JOIN @Student_Info si
             ON summary.studentid = si.studentid
    

    请注意,随着更多课程的添加,您可以使用动态 HTML 来调整查询:

    Pivot Table and Concatenate Columns

    【讨论】:

    猜你喜欢
    • 2015-07-23
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多