• sql行转列例子


    create table a 
    (
    学号 int null,
    姓名 nvarchar(20) null
    )
    insert into a (学号,姓名)
    select 1001 , '王一' union all
    select 1000 ,'李成'


    go
    create table b
    (
    学号 int null,
    科目 nvarchar(20) null,
    成绩 int null
    )
    insert into b(学号,科目,成绩)

    select 1001 ,'英语', 89 union all
    select 1001 ,'数学', 87 union all
    select 1000 ,'语文', 76 union all
    select 1000 ,'数学', 98 union all
    select 1000, '英语', 86
    --1
    SELECT * FROM (SELECT a.学号,a.姓名,b.科目,b.成绩 FROM a a INNER JOIN b b ON a.学号=b.学号) q
    PIVOT( max(成绩) FOR 科目 IN(语文,数学,英语)) w
    go

    --2
    WITH cte1 AS (
    SELECT a.姓名,b.科目,b.成绩
    FROM a a INNER JOIN b b ON a.学号=b.学号
    )
    SELECT cte1.姓名,
    max(CASE cte1.科目 WHEN '语文' THEN cte1.成绩 ELSE 0 END) AS 语文,
    max(CASE cte1.科目 WHEN '数学' THEN cte1.成绩 ELSE 0 END) AS 数学,
    max(CASE cte1.科目 WHEN '英语' THEN cte1.成绩 ELSE 0 END) AS 英语
    FROM cte1
    GROUP BY cte1.姓名
    go

    --3
    WITH cte1 AS (
    SELECT a.姓名,b.科目,b.成绩
    FROM a a INNER JOIN b b ON a.学号=b.学号
    )
    SELECT DISTINCT T.姓名,
    (SELECT max(成绩) FROM cte1 WHERE 姓名=t.姓名 AND 科目 = '语文') AS '语文',
    (SELECT max(成绩) FROM cte1 WHERE 姓名=t.姓名 AND 科目 = '数学') AS '数学',
    (SELECT max(成绩) FROM cte1 WHERE 姓名=t.姓名 AND 科目 = '英语') AS '英语'
    FROM cte1 T
    4
    DECLARE @str NVARCHAR(max)
    SELECT @str=Isnull(@str+'],[','')+科目 FROM b GROUP BY 科目
    SET @str ='[' + @str + ']'
    PRINT @str
    SET @str= 'select * from (SELECT aa.学号,aa.姓名,bb.科目,bb.成绩 FROM a aa INNER JOIN b bb ON aa.学号=bb.学号) q pivot( max(成绩) for 科目 in (' + @str + ') ) w '
    EXEC (@str)



     

  • 相关阅读:
    浅谈Java两种并发类型——计算密集型与IO密集型
    设置线程池的大小
    Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecuto
    gitlab的简单操作
    GitHub vs GitLab:区别?
    前端小知识汇总
    花里胡哨的CSS集锦
    码云如何上传代码
    小程序自定义底部导航
    Vue实践过程中的几个问题
  • 原文地址:https://www.cnblogs.com/emmy/p/2261893.html
Copyright © 2020-2023  润新知