簡單行列轉換記錄

由於作排課的時候須要用到行列轉換,咱們想要的是相似於這樣的效果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的結果  

在這裏作個記錄,方便接下來使用。

相關文章
相關標籤/搜索