SQL的行列转换问题
2006-12-06 21:32
531 查看
/article/5820039.html上提到了一个行列转换的方法,其实在2005里有更可读的写法,就是使用pivot运算符:
create table abc
(
student varchar(50),
class varchar(50),
grade int
)
INSERT INTO abc
SELECT '孙小美','数学',10 UNION ALL
SELECT '孙小美','语文',20 UNION ALL
SELECT '孙小美','英语',30 UNION ALL
SELECT '阿土伯','数学',40 UNION ALL
SELECT '阿土伯','语文',50 UNION ALL
SELECT '阿土伯','英语',60 UNION ALL
SELECT '小叮铛','数学',70 UNION ALL
SELECT '小叮铛','语文',80 UNION ALL
SELECT '小叮铛','英语',90
SELECT
student,
MAX(数学) AS 数学,
MAX(语文) AS 语文,
MAX(英语) AS 英语
FROM
(
SELECT
student,
CASE class WHEN '数学' THEN grade END AS 数学,
CASE class WHEN '语文' THEN grade END AS 语文,
CASE class WHEN '英语' THEN grade END AS 英语
FROM abc
) AS a
GROUP BY student
--用pivot运算符
select student,[数学] as '数学',[语文] as '语文' ,[英语] as '英语'
from
(select * from abc) as source
pivot
(
sum(grade)
for class in
([数学],[语文],[英语])
) as p
不过对于不知道具体列名的程序还真不好解决,生成动态sql话(调用sp_executesql),臂如:
declare @sql varchar(8000)
set @sql = 'select student,'
select @sql = @sql + 'sum(case class when '''+class+'''then grade else 0 end) as '''+class+''','
from (select distinct class from abc) as a
select @sql = left(@sql,len(@sql)-1) + ' from abc group by student'
exec(@sql)
倒是可以,不过却与当前存储过程调用不属于一批命令了,定义的CTE,局部临时表也访问不了,似乎只有放到业务层或数据层去解决了.
create table abc
(
student varchar(50),
class varchar(50),
grade int
)
INSERT INTO abc
SELECT '孙小美','数学',10 UNION ALL
SELECT '孙小美','语文',20 UNION ALL
SELECT '孙小美','英语',30 UNION ALL
SELECT '阿土伯','数学',40 UNION ALL
SELECT '阿土伯','语文',50 UNION ALL
SELECT '阿土伯','英语',60 UNION ALL
SELECT '小叮铛','数学',70 UNION ALL
SELECT '小叮铛','语文',80 UNION ALL
SELECT '小叮铛','英语',90
SELECT
student,
MAX(数学) AS 数学,
MAX(语文) AS 语文,
MAX(英语) AS 英语
FROM
(
SELECT
student,
CASE class WHEN '数学' THEN grade END AS 数学,
CASE class WHEN '语文' THEN grade END AS 语文,
CASE class WHEN '英语' THEN grade END AS 英语
FROM abc
) AS a
GROUP BY student
--用pivot运算符
select student,[数学] as '数学',[语文] as '语文' ,[英语] as '英语'
from
(select * from abc) as source
pivot
(
sum(grade)
for class in
([数学],[语文],[英语])
) as p
不过对于不知道具体列名的程序还真不好解决,生成动态sql话(调用sp_executesql),臂如:
declare @sql varchar(8000)
set @sql = 'select student,'
select @sql = @sql + 'sum(case class when '''+class+'''then grade else 0 end) as '''+class+''','
from (select distinct class from abc) as a
select @sql = left(@sql,len(@sql)-1) + ' from abc group by student'
exec(@sql)
倒是可以,不过却与当前存储过程调用不属于一批命令了,定义的CTE,局部临时表也访问不了,似乎只有放到业务层或数据层去解决了.
相关文章推荐
- 一个SQL语句的问题:行列转换
- 一个SQL语句的问题:行列转换
- Sql中关于行列转换问题
- 面试中遇到的sql语句行列转换问题
- SQL行列转换问题
- sql查询 竖排变横排及横排变竖排显示 行列转换问题
- 今天在csdn上遇到一个问题,是关于sql数据行列转换的,我的写法如下:
- sql行列转换问题
- sql行列转换问题 .
- sqlbulkcopy 使用DataTable作为数据源的数据类型问题--来自数据源的String类型的给定值不能转换为指定目标列的类型 uniqueidentifier
- SQL面试题练习-实现pivot行列转换
- sql行列转换,字符串相加
- SQL语句行列转换(附带数据库、表、视图操作)
- sql日期转换问题
- 深入SQL中PIVOT 行列转换详解
- SQL语句积累2:行列转换、case when筛选条件
- 行列转换等经典SQL语句
- SQL 行列转换
- sql行列转换例子(动态)
- SQL类型转换问题,