【问题标题】:How to use pivot to generate weekly TimeTable如何使用数据透视生成每周时间表
【发布时间】:2012-04-24 23:48:02
【问题描述】:

我想使用 sql server pivot 生成每周时间表。

我的数据库有这些表。

        create table Students
        (
            StudentID int identity primary key,
            Name nvarchar(50)
        )
        create table Times
        (
            TimeID int identity primary key
            ,Name nvarchar(10)
        )
        create table Days
        (
            DayID int identity primary key 
            ,Name nvarchar(20)
        )
        create table TimeTable
        (
            StudentID int references Students(StudentID)
            ,TimeID int references Times(TimeID)
            ,DayID int references Days(DayID)
            ,Value nvarchar(50)
        )

        insert Times values('t1')
        insert Times values('t2')
        insert Times values('t3')



        insert Days values('sunday')
        insert Days values('monday')
        insert Days values('tuesday')
        insert Days values('wednesday')
        insert Days values('thursday')
        insert Days values('friday')
        insert Days values('saturday')

我想要列(DayID,DayName,t1,t2,t3)

我正在使用此查询,但由于在将记录插入时间表表时使用 Max(Value) 聚合函数,此查询显示列 t1、t2 和 t3 的一个值。但是 t2 和 t3 应该为 null

            SELECT      *
            FROM         (SELECT     dbo.Days.DayID, dbo.Days.Name, dbo.Times.Name AS Expr1, dbo.TimeTable.Value
            FROM         dbo.Times CROSS JOIN
                                  dbo.Days LEFT OUTER JOIN
                                  dbo.TimeTable ON dbo.Days.DayID = dbo.TimeTable.DayID) AS d_1
            PIVOT (max (Value) FOR [Expr1] 
            IN (t1, t2, t3)) AS P 

例如在执行这些 cmds 后,所有列都会显示 asp 值。

        insert Students values('ahmad')
            insert TimeTable values(1,1,1,'asp') 

【问题讨论】:

    标签: tsql sql-server-2000 pivot


    【解决方案1】:

    您错过了从 TimeTable 到 Times 的匹配项:

     AND dbo.Times.TimeID = dbo.TimeTable.TimeID
    

    【讨论】:

      【解决方案2】:

      你已经很接近了,试试这个:

      create table #Students
      (
          StudentID int identity primary key,
          Name nvarchar(50)
      )
      create table #Times
      (
          TimeID int identity primary key
          ,Name nvarchar(10)
      )
      create table #Days
      (
          DayID int identity primary key 
          ,Name nvarchar(20)
      )
      create table #TimeTable
      (
          StudentID int references #Students(StudentID)
          ,TimeID int references #Times(TimeID)
          ,DayID int references #Days(DayID)
          ,Value nvarchar(50)
      )
      
      insert #Times values('t1')
      insert #Times values('t2')
      insert #Times values('t3')
      
      insert #Days values('sunday')
      insert #Days values('monday')
      insert #Days values('tuesday')
      insert #Days values('wednesday')
      insert #Days values('thursday')
      insert #Days values('friday')
      insert #Days values('saturday')
      
      insert #Students values('ahmad')
      insert #TimeTable values(1,1,1,'asp') 
      
      SELECT *
      FROM 
      (
          SELECT     d.DayID, d.Name, t.Name AS Expr1, tt.Value
          FROM         #Times t 
          CROSS JOIN #Days d
          LEFT OUTER JOIN #TimeTable tt
              ON d.DayID = tt.DayID
              AND t.TimeID = tt.TimeID) AS d_1
      PIVOT (max (Value) FOR [Expr1] 
      IN (t1, t2, t3)) AS P 
      
      
      drop table #Students
      drop table #Times
      drop table #Days
      drop table #TimeTable
      

      【讨论】:

      • 不客气,如果答案有帮助,请务必通过左侧的复选标记将其标记为答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多