zoukankan      html  css  js  c++  java
  • SQL pivot 基本用法 行列转换 数据透视

    SQL通过pivot进行行列转换 数据透视

    可直接在sql server 运行

    传统操作 和 pivot

    create table XKCl
    	(name nchar(10) not null,
    	 学科 nchar(10) not null,
    	 成绩 int    not null,
    	 考试 nchar(10) not null
    	 )
    
    
    insert into  dbo.XKCJ values ('张三','语文',79,'期中')
    insert into  dbo.XKCJ values ('李四','语文',85,'期中')
    insert into  dbo.XKCJ values ('王五','语文',75,'期中')
    insert into  dbo.XKCJ values ('张三','数学',93,'期中')
    insert into  dbo.XKCJ values ('李四','数学',98,'期中')
    insert into  dbo.XKCJ values ('王五','数学',87,'期中')
    insert into  dbo.XKCJ values ('张三','英语',92,'期中')
    insert into  dbo.XKCJ values ('李四','英语',90,'期中')
    insert into  dbo.XKCJ values ('王五','英语',88,'期中')
    insert into  dbo.XKCJ values ('张三','语文',80,'期末')
    insert into  dbo.XKCJ values ('李四','语文',81,'期末')
    insert into  dbo.XKCJ values ('王五','语文',79,'期末')
    insert into  dbo.XKCJ values ('张三','数学',90,'期末')
    insert into  dbo.XKCJ values ('李四','数学',95,'期末')
    insert into  dbo.XKCJ values ('王五','数学',80,'期末')
    insert into  dbo.XKCJ values ('张三','英语',92,'期末')
    insert into  dbo.XKCJ values ('李四','英语',90,'期末')
    insert into  dbo.XKCJ values ('王五','英语',85,'期末')
    
    SELECT * 
    FROM XKCJ
    
    name       学科         成绩          考试
    ---------- ---------- ----------- ----------------
    张三         语文         79          期中
    李四         语文         85          期中
    王五         语文         75          期中
    张三         数学         93          期中
    李四         数学         98          期中
    王五         数学         87          期中
    张三         英语         92          期中
    李四         英语         90          期中
    王五         英语         88          期中
    张三         语文         80          期末
    李四         语文         81          期末
    王五         语文         79          期末
    张三         数学         90          期末
    李四         数学         95          期末
    王五         数学         80          期末
    张三         英语         92          期末
    李四         英语         90          期末
    王五         英语         85          期末
    

    计算两次考试每名学生各科的最高成绩

    select name,
    	max(case 学科 when '数学' then 成绩 else 0 end )as 数学,
    	max(case 学科 when '英语' then 成绩 else 0 end )as 英语,
    	max(case 学科 when '语文' then 成绩 else 0 end )as 语文
    From dbo.XKCJ
    	group by name
    
    SELECT name,
    	max(数学) 数学,
    	max(英语) 英语,
    	max(语文) 语文
    FROM dbo.XKCJ 
    	pivot(max(成绩) FOR 学科 IN (语文,数学,英语)) tbnewtb
    	group by name 
    
    SELECT *
    FROM (select name,学科,成绩
    	  from  dbo.XKCJ) new
    pivot(max(成绩) FOR 学科 IN (数学,英语,语文)) newtb
    	
    	
    name       数学          英语          语文
    ---------- ----------- ----------- -----------
    李四         98          90          85
    王五         87          88          79
    张三         93          92          80
    

    计算两次考试各科的最高成绩

    select 考试 ,
    	max(case 学科 when '数学' then 成绩 else 0 end )as 数学,
    	max(case 学科 when '英语' then 成绩 else 0 end )as 英语,
    	max(case 学科 when '语文' then 成绩 else 0 end )as 语文
    From dbo.XKCJ
    	group by 考试 
    
    SELECT *
    FROM (select 考试,学科,成绩
    	  from  dbo.XKCJ) new
    pivot(max(成绩) FOR 学科 IN (数学,英语,语文)) newtb	
    
    	
    考试          数学         英语       语文
    ---------- ----------- ----------- -----------
    期末           95          92          81
    期中           98          92          85
    

    行列转换

    select name,考试,
    	sum(case 学科 when '数学' then 成绩 else 0 end )as 数学,
    	sum(case 学科 when '英语' then 成绩 else 0 end )as 英语,
    	sum(case 学科 when '语文' then 成绩 else 0 end )as 语文
    From dbo.XKCJ
    	group by name,考试
    
    SELECT *
    FROM dbo.XKCJ 
    pivot(max(成绩) FOR 学科 IN (语文,数学,英语)) newtb
    
    name         考试         语文          数学       英语
    ---------- -----------  ----------- ----------- -----------
    李四         期末          81          95          90
    王五         期末          79          80          85
    张三         期末          80          90          92
    李四         期中          85          98          90
    王五         期中          75          87          88
    张三         期中          79          93          92
    
    SELECT name,语文,数学,英语
    FROM dbo.XKCJ 
    pivot(max(成绩) FOR 学科 IN (语文,数学,英语)) newtb
    name       语文          数学          英语
    ---------- ----------- ----------- -----------
    李四         81          95          90
    王五         79          80          85
    张三         80          90          92
    李四         85          98          90
    王五         75          87          88
    张三         79          93          92
    

    计算每个同学每次考试的总分、平均分

    select name,考试,
    	sum(case 学科 when '数学' then 成绩 else 0 end )as 数学,
    	sum(case 学科 when '英语' then 成绩 else 0 end )as 英语,
    	sum(case 学科 when '语文' then 成绩 else 0 end )as 语文,
    	SUM(成绩) as total,
    	AVG(成绩) as 平均
    From dbo.XKCJ
    	group by name,考试
    
    SELECT *,
    		数学+英语+语文 as total,
    		(数学+英语+语文)/3 as 平均
    FROM dbo.XKCJ 
    pivot(max(成绩) FOR 学科 IN (数学,英语,语文)) newtb
    
    name       考试         数学          英语         语文      total      平均
    --------  ---------- ----------- ----------- ----------- ----------- -----------
    李四         期末         95          90          81          266         88
    王五         期末         80          85          79          244         81
    张三         期末         90          92          80          262         87
    李四         期中         98          90          85          273         91
    王五         期中         87          88          75          250         83
    张三         期中         93          92          79          264         88
    
    
  • 相关阅读:
    php性能测试工具
    linux的openssl
    Nginx与Apache的Rewrite规则的区别
    mysql索引总结----mysql 索引类型以及创建
    不支持正在使用的 .Net 组帧模式。有关详细信息,请参阅服务器日志--解决方案
    c#获取网页源代码
    关于线程间操作无效: 从不是创建控件“xx”的线程访问它,错误解决方法(自定义委托和系统委托Action或Func解决)
    联想笔记本官网驱动下载
    easy ui combotree的操作
    c# 搜狗拼音输入法,刷输入速度和累计输入
  • 原文地址:https://www.cnblogs.com/li-volleyball/p/5490723.html
Copyright © 2011-2022 走看看