码迷,mamicode.com
首页 > 数据库 > 详细

mysql 行转换列

时间:2014-11-28 18:03:19      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:blog   http   io   ar   使用   sp   for   on   数据   

http://www.cnblogs.com/acelove/archive/2004/11/29/70434.html上提到了一个行列转换的方法,其实在2005里有更可读的写法,就是使用pivot运算符:

bubuko.com,布布扣create table abc 
bubuko.com,布布扣(
bubuko.com,布布扣student varchar(50),
bubuko.com,布布扣class varchar(50),
bubuko.com,布布扣grade int
bubuko.com,布布扣)
bubuko.com,布布扣INSERT INTO abc
bubuko.com,布布扣SELECT ‘孙小美‘,‘数学‘,10 UNION ALL
bubuko.com,布布扣SELECT ‘孙小美‘,‘语文‘,20 UNION ALL
bubuko.com,布布扣SELECT ‘孙小美‘,‘英语‘,30 UNION ALL
bubuko.com,布布扣SELECT ‘阿土伯‘,‘数学‘,40 UNION ALL
bubuko.com,布布扣SELECT ‘阿土伯‘,‘语文‘,50 UNION ALL
bubuko.com,布布扣SELECT ‘阿土伯‘,‘英语‘,60 UNION ALL
bubuko.com,布布扣SELECT ‘小叮铛‘,‘数学‘,70 UNION ALL
bubuko.com,布布扣SELECT ‘小叮铛‘,‘语文‘,80 UNION ALL
bubuko.com,布布扣SELECT ‘小叮铛‘,‘英语‘,90
bubuko.com,布布扣
bubuko.com,布布扣SELECT 
bubuko.com,布布扣    student,
bubuko.com,布布扣    MAX(数学) AS 数学,
bubuko.com,布布扣    MAX(语文) AS 语文,
bubuko.com,布布扣    MAX(英语) AS 英语
bubuko.com,布布扣FROM
bubuko.com,布布扣    (
bubuko.com,布布扣    SELECT 
bubuko.com,布布扣        student,
bubuko.com,布布扣        CASE class WHEN ‘数学‘ THEN grade END AS 数学,
bubuko.com,布布扣        CASE class WHEN ‘语文‘ THEN grade END AS 语文,
bubuko.com,布布扣        CASE class WHEN ‘英语‘ THEN grade END AS 英语
bubuko.com,布布扣    FROM abc
bubuko.com,布布扣    ) AS a
bubuko.com,布布扣GROUP BY student 
--用pivot运算符bubuko.com,布布扣
bubuko.com,布布扣select student,[数学] as ‘数学‘,[语文] as ‘语文‘ ,[英语] as ‘英语‘
bubuko.com,布布扣from
bubuko.com,布布扣 (select * from abc) as source
bubuko.com,布布扣    pivot
bubuko.com,布布扣    (
bubuko.com,布布扣        sum(grade)
bubuko.com,布布扣        for class  in
bubuko.com,布布扣        ([数学],[语文],[英语])
bubuko.com,布布扣    ) as p


不过对于不知道具体列名的程序还真不好解决,生成动态sql话(调用sp_executesql),臂如:

bubuko.com,布布扣declare @sql varchar(8000)
bubuko.com,布布扣set @sql = ‘select student,‘
bubuko.com,布布扣select @sql = @sql + ‘sum(case class when ‘‘‘+class+‘‘‘then grade else 0 end) as ‘‘‘+class+‘‘‘,‘
bubuko.com,布布扣  from (select distinct class from abc) as a 
bubuko.com,布布扣select @sql = left(@sql,len(@sql)-1) + ‘ from abc group by student‘
bubuko.com,布布扣exec(@sql)

倒是可以,不过却与当前存储过程调用不属于一批命令了,定义的CTE,局部临时表也访问不了,似乎只有放到业务层或数据层去解决了.

mysql 行转换列

标签:blog   http   io   ar   使用   sp   for   on   数据   

原文地址:http://www.cnblogs.com/shenming/p/4128968.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!