zoukankan      html  css  js  c++  java
  • SQL Server(00):行列转换PIVOT与unPIVOT

    一、sql行转列:PIVOT

    基本语法:

    create table #table1
        (    id int ,code varchar(10) , name varchar(20) );
    go
    
    insert into #table1 ( id,code, name ) values ( 1, 'm1','a' ), ( 2,  'm2',null ), ( 3, 'm3', 'c' ), ( 4,  'm2','d' ), ( 5,  'm1','c' );
    go
    
    select * from #table1;
    
    --方法一
    select PVT.code, PVT.a, PVT.b, PVT.c
          from #table1 pivot(count(id) for name in(a, b, c)) as PVT;
    
    --方法二
    with P as (select * from #table1)
    select PVT.code, PVT.a, PVT.b, PVT.c 
         from P        pivot(count(id) for name in(a, b, c)) as PVT;
    
    drop table #table1;

    结果:

    image

    实例:

    3、先汇总拼接出所需列的字符串,再动态执行转列。

    先查询出要转为列的行数据,再拼接字符串。

    create table #table1
        (    id int ,code varchar(10) , name varchar(20) );
    go
    
    insert into #table1 ( id,code, name ) values ( 1, 'm1','a' ), ( 2,  'm2',null ), ( 3, 'm3', 'c' ), ( 4,  'm2','d' ), ( 5,  'm1','c' );
    go
    
    select * from #table1;
    
    
    declare @strCN nvarchar(100);
    select @strCN = isnull(@strCN + ',', '') + quotename(name) from #table1 group by name ;
    print  @strCN  --‘[a],[c],[d]’
    declare @SqlStr nvarchar(1000);
    
    set @SqlStr = N'
    select * from #table1 pivot ( count(ID) for name in (' + @strCN + N') ) as PVT';
    exec ( @SqlStr );
    
    drop table #table1;

    结果:

    image

    二、sql列转行:unPIVOT:

    基本语法:

    create table #table1 (id int,
    code varchar(10),
    name1 varchar(20),
    name2 varchar(20),
    name3 varchar(20));
    go
    insert into #table1(id, name1, name2, code, name3)
    values(1, 'm1', 'a1', 'a2', 'a3'),
        (2, 'm2', 'b1', 'b2', 'b3'),
        (4, 'm1', 'c1', 'c2', 'c3');
    go
    select * from #table1;
    
    --方法一
    select PVT.id, PVT.code, PVT.name, PVT.val 
                from #table1 unpivot(val for name in(name1, name2, name3)) as PVT;
    
    --方法二
    with P as (select * from #table1)
    select PVT.id, PVT.code, PVT.name, PVT.val 
                from P       unpivot(val for name in(name1, name2, name3)) as PVT;
    
    drop table #table1;

    结果:

    image

    实例:

  • 相关阅读:
    Python Web框架Django (三)
    谷歌把域名标记为不安全的解决办法
    tkmybatis VS mybatisplus
    jdbc预编译实现方式
    分析mybatis中 #{} 和${}的区别
    实体类id的几种生成方式
    java 获取mac地址
    javafx 表格某一列设置未复选框
    关闭在chrome里使用双指前进后退页面的功能
    调试maven源代码
  • 原文地址:https://www.cnblogs.com/springsnow/p/10284301.html
Copyright © 2011-2022 走看看