zoukankan      html  css  js  c++  java
  • SQLserver 如何优雅的行转列

    前言


    工作中在处理数据数据时,我们常常会遇到需要把数据库的数据进行行转列的操作,以下,记录两种方式的行转列。

    实现方式

    在这之前需要执行以下操作,插入测试数据,方便后续举例子。

    创建成绩表

    创建一张成绩表,创建SQL语句如下:

    CREATE TABLE CJ
    (
    	Id INT PRIMARY KEY IDENTITY(1,1), --主键
    	NZ VARCHAR(50),	 --姓名
    	KM VARCHAR(50),  --科目
    	CJ INT,	         --成绩
    	CJSJ DATETIME    --时间
    )
    

    插入数据

    添加测试数据,创建SQL语句如下所示:

    insert into CJ  (NZ,KM,CJ,CJSJ) VALUES ('大明','语文',100,getdate()) 
    insert into CJ  (NZ,KM,CJ,CJSJ) VALUES ('大明','数学',90,getdate())
    insert into CJ  (NZ,KM,CJ,CJSJ) VALUES ('大明','英语',80,getdate())
    insert into CJ  (NZ,KM,CJ,CJSJ) VALUES ('大明','生物',70,getdate())
    insert into CJ  (NZ,KM,CJ,CJSJ) VALUES ('大明','物理',60,getdate())
    
    insert into CJ  (NZ,KM,CJ,CJSJ) VALUES ('小明','语文',50,getdate()) 
    insert into CJ  (NZ,KM,CJ,CJSJ) VALUES ('小明','数学',60,getdate())
    insert into CJ  (NZ,KM,CJ,CJSJ) VALUES ('小明','英语',70,getdate())
    insert into CJ  (NZ,KM,CJ,CJSJ) VALUES ('小明','生物',80,getdate())
    insert into CJ  (NZ,KM,CJ,CJSJ) VALUES ('小明','物理',60,getdate())
    

    实现行转列

    实现行转列有两种方式,方式一,可通过CASE WHEN 实现;方式二:可通过PIVOT实现;以下是分别使用这两种方式实现的具体语法。

    方式一:CASE WHEN

    SQL查询语句如下所示:

    SELECT  NZ '姓名',
    MAX(CASE KM WHEN '语文' then CJ ELSE 0 END) '语文',
    MAX(CASE KM WHEN '数学' then CJ ELSE 0 END) '数学',
    MAX(CASE KM WHEN '数学' then CJ ELSE 0 END) '数学',
    MAX(CASE KM WHEN '生物' then CJ ELSE 0 END) '生物',
    MAX(CASE KM WHEN '物理' then CJ ELSE 0 END) '物理'
    FROM CJ
    GROUP BY NZ
    

    方式二:PIVOT

    SQL查询语句如下所示:

    SELECT * FROM
    (
    	SELECT 姓名=NZ,科目=KM,成绩=CJ 
    	FROM CJ
    ) A  
    PIVOT 
    (
    	SUM(A.成绩) FOR A.科目 IN (语文,数学,英语,生物,物理)
    ) P
    

    最后,两种方式的实现的效果如下:

  • 相关阅读:
    Java 深拷贝和浅拷贝 利用序列化实现深拷贝
    算法题005 剑指Offer面试题29 数组中出现次数超过一半的数字
    算法题003 斐波那契(Fibonacci)数列
    Android Sensors (4) 传感器使用最佳实践
    Android WebView使用基础
    Java 多线程(八) 线程状态图
    算法题006 判断两个链表是否相交
    Java 多线程(五) 多线程的同步
    算法题001 剑指Offer 面试题三:二维数组中的查找
    Android绘制基础及手写绘制实例
  • 原文地址:https://www.cnblogs.com/ZengJiaLin/p/15108865.html
Copyright © 2011-2022 走看看