zoukankan      html  css  js  c++  java
  • SQL SERVER 行转列/列转行

    https://www.cnblogs.com/Rawls/p/11027413.html

    /*
        第一步:创建临时表结构
    */
    CREATE TABLE #Student  --创建临时表
    (
        StuName nvarchar(20),    --学生名称
        StuSubject nvarchar(20),--考试科目
        StuScore int            --考试成绩
    )
    DROP TABLE #Student      --删除临时表
    SELECT * FROM #Student   --查询所有数据
    
    
    
    
    /*
        第二步:写入测试数据
    */
    --张三
    INSERT INTO #Student(StuName,StuSubject,StuScore) values ('张三','语文',80);  
    INSERT INTO #Student(StuName,StuSubject,StuScore) values ('张三','数学',75);
    INSERT INTO #Student(StuName,StuSubject,StuScore) values ('张三','英语',65);
    --李四
    INSERT INTO #Student(StuName,StuSubject,StuScore) values ('李四','语文',36);  
    INSERT INTO #Student(StuName,StuSubject,StuScore) values ('李四','数学',56);
    INSERT INTO #Student(StuName,StuSubject,StuScore) values ('李四','英语',38);
    --王五
    INSERT INTO #Student(StuName,StuSubject,StuScore) values ('王五','语文',69);  
    INSERT INTO #Student(StuName,StuSubject,StuScore) values ('王五','数学',80);
    INSERT INTO #Student(StuName,StuSubject,StuScore) values ('王五','英语',78);
    --赵六
    INSERT INTO #Student(StuName,StuSubject,StuScore) values ('赵六','语文',80);  
    INSERT INTO #Student(StuName,StuSubject,StuScore) values ('赵六','数学',80);
    INSERT INTO #Student(StuName,StuSubject,StuScore) values ('赵六','英语',95);
    --1、case when 方法
    SELECT StuSubject
        ,SUM(CASE WHEN StuName='张三' THEN StuScore END) as '张三'
        ,SUM(CASE WHEN StuName='王五' THEN StuScore END) as '王五'
        ,SUM(CASE WHEN StuName='赵六' THEN StuScore END) as '赵六'
    FROM #Student
    GROUP BY StuSubject
    --2使用PIVOT 关键字
    SELECT *
    FROM #Student
    PIVOT(SUM(StuScore) FOR [StuName] IN("李四","王五","张三","赵六")) AS T 
    --方法3:使用PIVOT、EXEC关键字,动态执行
    Declare @StuName varchar(100);
    Declare @sql nvarchar(4000)
    --步骤1.假设列不固定,是动态产生的,需要先将所有列组合成一个长字符串,比如A,B,C ,    下面的写法只能在SQL server2017中运行,更多将多行字段合并成一个字段方法参考:https://www.cnblogs.com/Rawls/p/10758788.html
    SELECT @StuName='"'+STRING_AGG(StuName,'","')+'"'    
    FROM (
        SELECT StuName from #Student GROUP BY StuName
    ) AS TE
    --Print @StuName
    --步骤2.由于动态产生的列,脚本不能执行,所以用Exec来执行,把脚本写成一个字符串。
    SET @sql='
        SELECT *
        FROM #Student
        PIVOT(SUM(StuScore) FOR [StuName] IN('+@StuName+')) AS T 
        '
    --步骤3.执行脚本
    Exec(@sql)
  • 相关阅读:
    第一章ASP.NET SignalR简介
    第六章SignalR的服务器广播
    第五章SignalR的实时高频通讯
    第四章SignalR自托管主机
    第三章SignalR在线聊天例子
    第二章SignalR所支持的平台
    DevExpress ASPxHtmlEditor控件格式化并导出Word (修复中文字体导出丢失)
    改进的简单Tooltips显示
    C# WebForm 使用NPOI 2 生成简单的word文档(.docx)
    一些自用的小工具,分享给非程序猿们
  • 原文地址:https://www.cnblogs.com/Bokeyan/p/13495198.html
Copyright © 2011-2022 走看看