SQL 对字符的内容行表,怎么进行,行转列做法??
表内容是:
姓名 科目 排名
张三 语文 第一
张三 数学 第二
张三 英语 第一
李四 语文 第三
李四 数学 第一
李四 英语 第二
王五 语文 第二
王五 数学 第三
王五 英语 第三
表内容科目还会有多类的。
要行转列成如下:
姓名 语文 数学 英语
张三 第一 第二 第一
李四 第三 第一 第二
王五 第二 第三 第三
[解决办法]
--参考
if object_id('#test') is not null
drop table #test
go
CREATE TABLE [dbo].[#test](
dep [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
depId [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
company [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
cost [float] NULL
)
insert into #test values('AC','001','DHL','26')
insert into #test values('AC','001','EMS','221')
insert into #test values('AC','001','SF','312')
insert into #test values('AC','005','EMS','32')
insert into #test values('AC','005','SF','79')
insert into #test values('AI','002','DHL','28')
insert into #test values('AI','002','EMS','223')
insert into #test values('AI','002','TNT','173')
insert into #test values('AI','002','SF','329')
insert into #test values('FI','003','DHL','38')
insert into #test values('FI','003','EMS','233')
insert into #test values('BI','006','SF','79')
select * from #test
go
DECLARE @s NVARCHAR(4000)
SET @s = ''
SELECT @s = @s + ',' + QUOTENAME([company]) + '=max(case when [company]='
+ QUOTENAME([company], '''') + ' then [cost] else 0 end)'
FROM #test
GROUP BY [company]
EXEC('select dep,depid'+@s+' from #test group by dep,depid')
CREATE TABLE [dbo].[#test1](
[姓名] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[科目] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[排名] [nvarchar](50) NULL
)
insert into #test1 values('张三','语文','第一')
insert into #test1 values('张三','数学','第二')
insert into #test1 values('张三','英语','第一')
insert into #test1 values('李四','语文','第三')
insert into #test1 values('李四','数学','第一')
insert into #test1 values('李四','英语','第二')
insert into #test1 values('王五','语文','第二')
insert into #test1 values('王五','数学','第三')
insert into #test1 values('王五','英语','第三')
go
select * from #test1
go
declare @sql nvarchar(max)
set @sql =''
select @sql = @sql+','+ quotename([科目])+'=max(case when 科目 ='+quotename([科目],'''')+' then 排名 end)'
from #test1 group by [科目]
exec('select [姓名] '+@sql+' from #test1 group by [姓名]')
create table acc
(姓名 varchar(10), 科目 varchar(10), 排名 varchar(10))
insert into acc
select '张三', '语文', '第一' union all
select '张三', '数学', '第二' union all
select '张三', '英语', '第一' union all
select '李四', '语文', '第三' union all
select '李四', '数学', '第一' union all
select '李四', '英语', '第二' union all
select '王五', '语文', '第二' union all
select '王五', '数学', '第三' union all
select '王五', '英语', '第三'
select 姓名,[语文],[数学],[英语]
from acc a
pivot(max(排名) for 科目 in([语文],[数学],[英语])) p
/*
姓名 语文 数学 英语
---------- ---------- ---------- ----------
李四 第三 第一 第二
王五 第二 第三 第三
张三 第一 第二 第一
(3 row(s) affected)
*/