由于作排课的时候须要用到行列转换,咱们想要的是相似于这样的效果sql
(图一)测试
姓名 | 计算机科学 | 运筹学 |
张三 | Y | N |
李四 | Y | N |
王五 | N | Y |
若是把这当作一张表,它的查询结果应该是这样的spa
(图二)3d
张三 | 计算机科学 | Y |
张三 | 运筹学 | N |
李四 | 计算机科学 | Y |
李四 | 运筹学 | N |
王五 | 计算机科学 | N |
王五 | 运筹学 | Y |
要想获得图一的效果,就须要用到行列转换。
blog
1,咱们先来建立几张表。ci
1.1建立班级表 GO CREATE TABLE [dbo].[Class]( [cid] [int] IDENTITY(1,1) NOT NULL, [classname] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL, PRIMARY KEY CLUSTERED ( [cid] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF 1.2建立学生表 GO CREATE TABLE [dbo].[Student]( [sid] [int] IDENTITY(1,1) NOT NULL, [username] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL, [userpwd] [varchar](64) COLLATE Chinese_PRC_CI_AS NOT NULL, [cid] [int] NOT NULL, PRIMARY KEY CLUSTERED ( [sid] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO ALTER TABLE [dbo].[Student] WITH CHECK ADD CONSTRAINT [FK_Student_Class] FOREIGN KEY([cid]) REFERENCES [dbo].[Class] ([cid]) 1.3建立课程表 GO CREATE TABLE [dbo].[Course]( [crid] [int] IDENTITY(1,1) NOT NULL, [coursename] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL, [cid] [int] NOT NULL, PRIMARY KEY CLUSTERED ( [crid] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO ALTER TABLE [dbo].[Course] WITH CHECK ADD CONSTRAINT [FK_Course_Class] FOREIGN KEY([cid]) REFERENCES [dbo].[Class] ([cid])
2.为这三张表建立关联视图,可知班级和学生,班级和课程都是一对多的关系。数学
3.向各表中插入测试数据。table
INSERT INTO [dbo].[Class] ([classname]) VALUES ('一期班')class
INSERT INTO [dbo].[Class] ([classname]) VALUES ('二期班')计算机科学
INSERT INTO [dbo].[Class] ([classname]) VALUES ('三期班')
INSERT INTO [dbo].[Student] ([username] ,[userpwd] ,[cid]) VALUES ('张三' ,'111' ,1)
INSERT INTO [dbo].[Student] ([username] ,[userpwd] ,[cid]) VALUES ('李四' ,'111' ,1)
INSERT INTO [dbo].[Student] ([username] ,[userpwd] ,[cid]) VALUES ('小李' ,'111' ,1)
INSERT INTO [dbo].[Student] ([username] ,[userpwd] ,[cid]) VALUES ('王五' ,'111' ,2)
INSERT INTO [dbo].[Student] ([username] ,[userpwd] ,[cid]) VALUES ('马六' ,'111' ,2)
INSERT INTO [dbo].[Course] ([CourseName],[cid]) VALUES ('计算机科学',1)
INSERT INTO [dbo].[Course] ([CourseName],[cid]) VALUES ('运筹学',2)
INSERT INTO [dbo].[Course] ([CourseName],[cid]) VALUES ('逻辑学',2)
INSERT INTO [dbo].[Course] ([CourseName],[cid]) VALUES ('高级数学',1)
3.因为须要对这三张表联合查询进行操做,仍是建立视图比较靠谱。
因而乎建立视图
CREATE VIEW [dbo].[vm_classCourse]
AS
CREATE VIEW [dbo].[vm_classCourse] AS SELECT dbo.Class.*, dbo.Course.coursename, dbo.Course.crid, dbo.Student.sid, dbo.Student.username, dbo.Student.userpwd FROM dbo.Class INNER JOIN dbo.Course ON dbo.Class.cid = dbo.Course.cid INNER JOIN dbo.Student ON dbo.Class.cid = dbo.Student.cid GO
所得结果列表,(数据位测试数据,和建表数据有出入)
如何获得图一的效果呢?Declare @sql varchar(8000)
Set @sql = 'Select username as 姓名,userpwd as 密码' Select @sql = @sql + ',sum(case coursename when '''+coursename+''' then sid else 0 end) ['+coursename+']' from (select distinct coursename from vm_classcourse where cid=1) as vm_classcourse --把全部惟一的科目的名称都列举出来 Select @sql = @sql+' from vm_classcourse group by username,userpwd,cid having cid=1' --cid为筛选条件
Exec (@sql)
这就获得了相似于图一的结果集,一下是班级ID为1的结果
在这里作个记录,方便接下来使用。