首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

SQL 对字符的内容行表,如何进行,行转列做法?

2013-06-25 
SQL 对字符的内容行表,怎么进行,行转列做法??表内容是:姓名科目排名张三语文第一张三数学第二张三英语第一

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)
*/

热点排行