zoukankan      html  css  js  c++  java
  • 通过sql做数据透视表,数据库表行列转换(pivot和Unpivot用法)(一)

    在mssql中大家都知道可以使用pivot来统计数据,实现像excel的透视表功能

    一、MSsqlserver中我们通常的用法

    1、Sqlserver数据库测试
    ---创建测试表
    Create table s(
    
    
        [name] nvarchar(50),
        book nvarchar(50),
        saledNumber int
    )
    ----插入测试数据
    insert into s ([name],book,saledNumber) values('小王','java从入门到精通',10);
    insert into s ([name],book,saledNumber)values('小李','java从入门到精通',15);
    insert into s ([name],book,saledNumber)values('小王','C#高级编程',8);
    insert into s ([name],book,saledNumber)values('小李','java从入门到精通',7);
    insert into s ([name],book,saledNumber)values('小王','java从入门到精通',9);
    insert into s ([name],book,saledNumber)values('小李','java从入门到精通',2);
    insert into s ([name],book,saledNumber)values('小王','C#高级编程',3);
    insert into s ([name],book,saledNumber)values('小李','java从入门到精通',5);
    insert into s ([name],book,saledNumber)values('小李','C#高级编程',5);
    
    
    ---1、通过case when 方式
    SELECT [name], sum(case  book when 'java从入门到精通' then saledNumber else 0 end) as [java从入门到精通],sum(case  book when 'C#高级编程' then saledNumber else 0 end) as [C#高级编程], sum(saledNumber) as [sum] from s group by [name]
    
    
    ---2、通过pivot
    select sa.name,sa.java从入门到精通,sa.C#高级编程 ,sa.java从入门到精通+sa.C#高级编程 as 合计 from s
     pivot(sum(saledNumber) for book in (java从入门到精通,C#高级编程)) sa
    

      

    二、oracle 的用法

    ---创建测试表
    Create table s(
    
        name varchar(50),
        book varchar(50),
        saledNumber number(9)
    )
    ----插入测试数据
    insert into s (name,book,saledNumber) values('小王','java从入门到精通',10);
    insert into s (name,book,saledNumber)values('小李','java从入门到精通',15);
    insert into s (name,book,saledNumber)values('小王','C#高级编程',8);
    insert into s (name,book,saledNumber)values('小李','java从入门到精通',7);
    insert into s (name,book,saledNumber)values('小王','java从入门到精通',9);
    insert into s (name,book,saledNumber)values('小李','java从入门到精通',2);
    insert into s (name,book,saledNumber)values('小王','C#高级编程',3);
    insert into s (name,book,saledNumber)values('小李','java从入门到精通',5);
    insert into s (name,book,saledNumber)values('小李','C#高级编程',5);
    ----
    
    ---1、通过case when 方式
    SELECT name, sum(case book when 'java从入门到精通' then saledNumber else 0 end) as java从入门到精通 ,sum(case book when 'C#高级编程' then saledNumber else 0 end) as C#高级编程, sum(saledNumber) as sum from s group by name;
    
    ---2、通过pivot
    select * from (select name,saledNumber,book from s group by name, saledNumber, book ) 
    
     pivot(sum(saledNumber) for book in ('java从入门到精通','C#高级编程')) ;
    

      

    描述不清或者有错误的地方,希望大家指正修改,对于oracle中更多关于Pivot 和 Unpivot

    使用简单的 SQL 以电子表格类型的交叉表报表显示任何关系表中的信息,并将交叉表中的所有数据存储到关系表中。请参考oracle官方实例

    http://www.oracle.com/technetwork/cn/articles/11g-pivot-101924-zhs.html

    
    
  • 相关阅读:
    BRVAH(让RecyclerView变得更高效)(1)
    爬虫开发python工具包介绍 (4)
    爬虫开发python工具包介绍 (3)
    爬虫开发python工具包介绍 (2)
    爬虫开发python工具包介绍 (1)
    小白用shiro(2)
    hdu 1010 走到终点时刚好花掉所有时间 (DFS + 奇偶性剪枝 )
    vijos 1128 N个数选K个数 (DFS )
    poj 1321 棋盘问题(n行中放任意k行)
    DFS基础题
  • 原文地址:https://www.cnblogs.com/wangshuai6707/p/4645328.html
Copyright © 2011-2022 走看看