zoukankan      html  css  js  c++  java
  • mysql 行转换列

    http://www.cnblogs.com/acelove/archive/2004/11/29/70434.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,局部临时表也访问不了,似乎只有放到业务层或数据层去解决了.

  • 相关阅读:
    洛谷 P3808 【模板】AC自动机(简单版) 题解
    O3优化模板
    洛谷 P3909 异或之积 题解
    洛谷 P3870 [TJOI2009]开关 题解
    洛谷 P1891 疯狂LCM 题解
    洛谷 P5221 Product 题解
    洛谷 P2568 GCD 题解
    洛谷 P5639 【CSGRound2】守序者的尊严 题解
    扩展kmp板子
    [JZOJ3167] 【GDOI2013模拟3】查税
  • 原文地址:https://www.cnblogs.com/shenming/p/4128968.html
Copyright © 2011-2022 走看看