行转列的问提!pivot

乡村教师 2010-11-12 07:19:26
在我学习了http://topic.csdn.net/u/20080725/13/8cb20d0c-ff73-4447-b43c-6dc2ec2b81c0.html?seed=729847596&r=60413391#r_60413391
这个帖子以后我对我的数据进行了练习帮我看看是哪里出错了!
std_name test_name mark
谢丹静 科学水平1 60
邹李超 科学水平1 80
谢丹静 科学水平2 75
邹李超 科学水平2 80
如果用
select std_name,
max(case test_name when '科学水平1' then mark else 0 end) '科学水平1',
max(case test_name when '科学水平2' then mark else 0 end) '科学水平2'
from mark_view
group by std_name
结果是:
std_name 科学水平1 科学水平2
谢丹静 60 75
邹李超 80 80
但是如果用:
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + test_name from mark_view group by test_name
set @sql = '[' + @sql + ']'
exec('select * from(select * from mark_view) as a pivot(max(mark) for test_name in ('+@sql+'))as b ORDER BY std_name')
结果是:
std_name 科学水平1 科学水平2
谢丹静 60 NULL
谢丹静 NULL 75
邹李超 80 NULL
邹李超 NULL 80
郁闷啊!我不是计算机专业的。就是觉得好玩才自学EN也不怎么样!就是写点皮毛。
希望高手能给点迷津
...全文
107 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawugui 2010-11-13
  • 打赏
  • 举报
回复
在你机器上需要这样:
1、std_name varchar(20) --> std_name nvarchar(20)
2、test_name varchar(20) --> test_name nvarchar(20)
3、数据插入时带N。
4、declare @sql varchar(8000) --> declare @sql nvarchar(4000)

create table tb(std_name nvarchar(20),test_name nvarchar(20),mark int)
insert into tb values(N'谢丹静', N'科学水平1', 60)
insert into tb values(N'邹李超', N'科学水平1', 80)
insert into tb values(N'谢丹静', N'科学水平2', 75)
insert into tb values(N'邹李超', N'科学水平2', 80)
go

declare @sql nvarchar(4000)
select @sql = isnull(@sql + '],[' , '') + test_name from tb group by test_name
set @sql = '[' + @sql + ']'
exec('select * from(select * from tb) as a pivot(max(mark) for test_name in ('+@sql+'))as b ORDER BY std_name')

drop table tb

/*
std_name 科学水平1 科学水平2
-------------------- ----------- -----------
谢丹静 60 75
邹李超 80 80

(2 行受影响)
*/
--小F-- 2010-11-12
  • 打赏
  • 举报
回复
在我的机器上执行也正确
「已注销」 2010-11-12
  • 打赏
  • 举报
回复
可以加上print @sql,把sql打印出来看看。
乡村教师 2010-11-12
  • 打赏
  • 举报
回复
难道是我的表上,出的问题!我的mark_view 上是
std_id mark std_name test_name test_id
070801 60 谢丹静 科学水平1 4
070802 80 邹李超 科学水平1 4
070801 75 谢丹静 科学水平2 5
070802 80 邹李超 科学水平2 5
「已注销」 2010-11-12
  • 打赏
  • 举报
回复
没有修改就能执行。
你用我的脚本试试:

CREATE TABLE [#tp]
(
[std_name] nvarchar(100) NULL ,
[test_name] nvarchar(100) NULL ,
[mark] int
)
GO

--插入测试数据
INSERT INTO [#tp] ([std_name],[test_name],[mark])
SELECT '谢丹静','科学水平1','60' UNION
SELECT '邹李超','科学水平1','80' UNION
SELECT '谢丹静','科学水平2','75' UNION
SELECT '邹李超','科学水平2','80'
GO

----方法一
SELECT [std_name],[科学水平1],[科学水平2] FROM [#tp]
PIVOT(MAX([mark]) FOR [test_name] IN([科学水平1],[科学水平2]))pvt

----方法二
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + test_name from [#tp] group by test_name
set @sql = '[' + @sql + ']'
exec('select * from(select * from [#tp]) as a pivot(max(mark) for test_name in ('+@sql+'))as b ORDER BY std_name')

乡村教师 2010-11-12
  • 打赏
  • 举报
回复
我想知道的是
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + test_name from mark_view group by test_name
set @sql = '[' + @sql + ']'
exec('select * from(select * from mark_view) as a pivot(max(mark) for test_name in ('+@sql+'))as b ORDER BY std_name')
这句话是哪可修改的!因为我需要动态的
「已注销」 2010-11-12
  • 打赏
  • 举报
回复
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + test_name from [#tp] group by test_name
set @sql = '[' + @sql + ']'
exec('select * from(select * from [#tp]) as a pivot(max(mark) for test_name in ('+@sql+'))as b ORDER BY std_name')

std_name 科学水平1 科学水平2
------------------- ----------- -----------
谢丹静 60 75
邹李超 80 80

(2 row(s) affected)
「已注销」 2010-11-12
  • 打赏
  • 举报
回复
SELECT [std_name],[科学水平1],[科学水平2] FROM [#tp]
PIVOT(MAX([mark]) FOR [test_name] IN([科学水平1],[科学水平2]))pvt

std_name 科学水平1 科学水平2
--------- ----------- -----------
谢丹静 60 75
邹李超 80 80

(2 row(s) affected)

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧