• SQLServer之行数据转换为列数据


    准备工作

    创建表

     1 use [test1]
     2 go
     3 
     4 create table [dbo].[student](
     5     [id] [int] identity(1,1) not null,
     6     [name] [nvarchar](50) null,
     7     [project] [nvarchar](50) null,
     8     [score] [int] null,
     9  constraint [pk_student] primary key clustered 
    10 (
    11     [id] asc
    12 )with (pad_index = off, statistics_norecompute = off, ignore_dup_key = off, allow_row_locks = on, allow_page_locks = on) on [primary]
    13 ) on [primary]
    14 go

    插入数据

    1 insert into test1.dbo.student(name,project,score)
    2 values('张三','android','60'),
    3       ('张三','ios','70'),
    4       ('张三','html5','55'),
    5       ('张三','.net','100'),
    6       ('李四','android','60'),
    7       ('李四','ios','75'),
    8       ('李四','html5','90'),
    9       ('李四','.net','100');

    使用Case When和聚合函数进行行专列

    语法

    1 select column_name,
    2 <aggregation function>(<case when expression>)  
    3 from database.schema.table
    4 group by column_name

    语法解析

    column_name

    数据列列名

    aggregation function

    聚合函数,常见的有:sum,max,min,avg,count等。

    case when expression

    case when表达式

    示例

    1 select name,
    2 max(case project when 'android' then score end) as '安卓',
    3 max(case project when 'ios' then score end) as '苹果',
    4 max(case project when 'html5' then score end) as 'html5',
    5 max(case project when '.net' then score end) as '.net'
    6 from [test1].[dbo].[student]
    7 group by name

    示例结果

    转换前

    转换后

    使用PIVOT进行行专列

    PIVOT通过将表达式中一列中的唯一值转换为输出中的多个列来旋转表值表达式。并PIVOT在最终输出中需要的任何剩余列值上运行聚合,PIVOT提供比一系列复杂的SELECT...CASE语句指定的语法更为简单和可读的语法,PIVOT执行聚合并将可能的多行合并到输出中的单个行中。

     语法

     1 select <non-pivoted column>,  
     2     [first pivoted column] as <column name>,  
     3     [second pivoted column] as <column name>,  
     4     ...  
     5     [last pivoted column] as <column name>  
     6 from  
     7     (<select query that produces the data>)   
     8     as <alias for the source query>  
     9 pivot  
    10 (  
    11     <aggregation function>(<column being aggregated>)  
    12 for   
    13 [<column that contains the values that will become column headers>]   
    14     in ( [first pivoted column], [second pivoted column],  
    15     ... [last pivoted column])  
    16 ) as <alias for the pivot table>  
    17 <optional order by clause>;  

    语法解析

    <non-pivoted column>

    非聚合列。

    [first pivoted column]

    第一列列名。

    [second pivoted column]

    第二列列名。

    [last pivoted column]

    最后一列列名。

    <select query that produces the data>

    数据子表。

    <alias for the source query>  

    表别名。

    <aggregation function>

    聚合函数。

    <column being aggregated>

    聚合函数列,用于输出值列,最终输出中返回的列(称为分组列)将对其进行分组。

    [<column that contains the values that will become column headers>] 

    转换列,此列返回的唯一值将成为最终结果集中的字段。

    [first pivoted column], [second pivoted column],  ... [last pivoted column]

    数据行中每一行行要转换的列名。

    <optional order by clause>

    排序规则。

    示例

     1 select b.Name,b.[android],b.[ios],b.[html5],b.[.net] 
     2 from  
     3 (select Name,Project,Score from [test1].[dbo].[student])
     4 as a
     5 pivot
     6 (
     7     max(Score)
     8     for Project in ([android],[ios],[html5],[.net])
     9 ) 
    10 as b
    11 order by b.name desc

    示例结果

    转换前

    转换后

    注意事项

    1、如果输出列名不能在表转换列中,则不会执行任何计算。

    2、输出的所有列的列名的数据类型必须一致。

  • 相关阅读:
    CPU和GPU实现julia
    基于SURF特征的图像与视频拼接技术的研究和实现(一)
    验证码识别--type7
    机器视觉项目基础框架
    实现gabor filter的滤波
    神经网络研究项目--以工程师的视角
    集装箱项目
    基于海康监控的图像识别设计
    反人脸识别的思路和实现
    单向信息传输系统设计实现
  • 原文地址:https://www.cnblogs.com/vuenote/p/11258616.html
Copyright © 2020-2023  润新知