首先引用一篇博文地址:http://www.cnblogs.com/luluping/archive/2009/07/24/1530611.html
主要是通過動態組合case語句來產生sql,並動態執行。
個人在此照著碎碎念一下:
首先:如何從一個資料集中組合產生多分支的case?
比如:select distinct subject from studentcj ,該語句執行結果返回'語文'、'數學','物理'等3條記錄。
而我們要產生的case語句應該是這樣的:
case subject when '語文' then result end,
--case when subject='語文' then result end
case subject when '數學' then result end,
case subject when '物理' then result end
其中,subject的值不確定就是這3種,數目不固定,因此,我們就需要動態來構建這條sql語句了。
由於我們要從多條記錄中產生一條語句,因此,我們要使用select,而不是set,
具體sql如下:
代碼
declare @sql varchar(2000)
set @sql =''
select @sql=@sql+',case subject when '+sub.subject+' then result end' from (select distinct subject from studentcj) as sub
print @sql
--結果為:,case subject when 數學 then result end,case subject when 物理 then result end,case subject when 語文 then result end
知道如何構建不確定數目的case後,接下來的工作就好辦了。
------
總結一下行轉列的辦法:
代碼
--USE [MyTestDB]
--GO
--SET ANSI_NULLS ON
--GO
--SET QUOTED_IDENTIFIER ON
--GO
--SET ANSI_PADDING ON
--GO
--CREATE TABLE [dbo].[studentcj](
-- [uname] [varchar](20) COLLATE Chinese_PRC_CI_AS NOT NULL,
-- [subject] [varchar](20) COLLATE Chinese_PRC_CI_AS NOT NULL,
-- [result] [float] NOT NULL
--) ON [PRIMARY]
--
--GO
--SET ANSI_PADDING OFF
--truncate table studentcj
--insert into studentcj values('張三','語文',80)
--insert into studentcj values('張三','數學',90)
--insert into studentcj values('張三','物理',85)
--insert into studentcj values('李四','語文',85)
--insert into studentcj values('李四','數學',82)
--insert into studentcj values('李四','物理',96)
--法1
--select distinct c.uname as '姓名',
-- (select result from studentcj where uname=c.uname and subject='語文') as '語文' ,
-- (select result from studentcj where uname=c.uname and subject='數學') as '數學',
--(select result from studentcj where uname=c.uname and subject='物理') as '物理'
--from studentcj c
--法2
--select uname as '姓名',
--sum(case when subject='語文' then result end) as '語文',
--sum(case when subject='數學' then result end) as '數學',
--sum(case when subject='物理' then result end) as '物理'
--from studentcj group by uname
--法3
declare @sql varchar(2000)
set @sql='select uname as 姓名'
--下面這句要使用select,而不是set,因為它會使用一個資料集來組合條件
select @sql=@sql+',sum(case subject when '''+sub.subject+''' then result end) as '+sub.subject from (select distinct subject from studentcj) as sub
set @sql=@sql+' from studentcj group by uname'
--print(@sql)
exec(@sql)