2012-04-12 40 views
2

我想使用sql server pivot生成每周时间表。如何使用数据透视表来生成每周TimeTable

我的db有这些表。

 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') 

我想有柱(大卫·,DAYNAME,T1,T2,T3)

我使用这个查询,但因为使用MAX(值)聚集功能,当我记录插入时间表表此查询显示列T1,T2和t3.however T2和T3一个值应为空

  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') 

回答

0

你失踪的时间表火柴时报:

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

你很近试试这个:

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 
+0

非常感谢您的回答bluefeet。 – user1329379 2012-04-12 16:15:43

+0

欢迎您,如果答案有帮助,那么请确保您通过左侧的复选标记将其标记为答案。 – Taryn 2012-04-12 16:22:01