今天在工作的时候遇到了行列转换的问题,记得去年有一段时间经常写,但是许久不用已经记不太得了。好记性不如烂笔头,忙完之后赶紧记录一下。

关键字:PIVOT(行转列),UNPIVOT(列转行)

先说说 PIVOT(行转列)这是我今天遇到的问题


PIVOT(行专列)

主要语法:PIVOT(聚合函数(列) FOR 列 in (…) )AS P


完整语法:

table_source

PIVOT(

聚合函数(value_column)

FOR pivot_column

IN(<column_list>)

)


举例(这个最重要,没有例子只有概念的文章,不是好文章)

我这里有一张表

其中OperationDate这里一列是日期,要求是:对日期进行分组,统计Testuser每天的操作。最重要的是日期要做为列名显示,如下图

直接贴sql语句

DECLARE @columnNme NVARCHAR(4000)
SELECT @columnNme = ISNULL(@columnNme + ',', '') + QUOTENAME(CONVERT(varchar(100), [OperationDate], 23)) FROM [Test].[dbo].[OperationData]
group by CONVERT(varchar(100), [OperationDate], 23)
order by CONVERT(varchar(100), [OperationDate], 23)

--select(@columnNme )

---上面一部分,是取出不重复的日期,一会儿要做为列名, QUOTENAME是在“xxxx-xx-xx”这种不规则的列名合法化,它会变成[xxxx-xx-xx] , 加了两个
Declare @sql NVARCHAR(4000)
set @sql = 'select * from
(
SELECT od.UserName
,CONVERT(varchar(100), od.[OperationDate], 23) as 日期
,COUNT(1) as 浏览数
FROM [Test].[dbo].[OperationData] as od
group by CONVERT(varchar(100), od.[OperationDate], 23),od.UserName
) as t
pivot (
     max(浏览数) for 日期
     in ('+@columnNme +')
) as result'

--select(@sql)
EXEC( @sql)

这种写法是列名数量不固定的时候,需要动态生成。

下面是静态列名,也就是列名的数量是固定的

select * from
(
     SELECT od.UserName,CONVERT(varchar(100),od.[OperationDate], 23) as 日期,COUNT(1) as 浏览数
     FROM [Test].[dbo].[OperationData] as od
    group by CONVERT(varchar(100), od.[OperationDate], 23),od.UserName
    ) as t
    pivot (
    max(浏览数) for 日期
    in
    (
        [2016-05-21],
        [2016-05-22],
        [2016-05-23]
    )
) as result

Sql2008的行列转换之行转列的更多相关文章

  1. Kettle 行列互换之——行转列(多列数据合并成一列变为多行)

    原始需求如下: 业务系统设置成这样,见截图. 工资项目为了方便录入,都是做成列的. 但是这些数据需要和另外的费用报销系统的数据关联,费用报销系统的费用项目是横向的,用费用项目.金额的多行来表达.那么这 ...

  2. [Oracle]行列转换(行合并与拆分)

    使用wmsys.wm_concat 实现行合并 在 Oracle  中, 将某一个栏位的多行数据转换成使用逗号风格的一行显示.能够使用函数  wmsys.wm_concat 达成. 这个在上一篇 or ...

  3. linux文件内容列传行_行转列

    ================ 文件内容列传行_行转列  ================ 一.列转行 1.编辑测试文件 vi log.txt 16:23:00 8.2% 1773620k 16:2 ...

  4. KingbaseES 的行列转换

    目录 背景 行转列 数据准备 分组聚合函数+CASE 根据压缩数据的格式,横向展开数据列选取不同方式 crosstab函数 PIVOT 操作符 PIVOT 操作符的限制 工具 ksql 的元命令 \c ...

  5. sql 行专列 列转行 普通行列转换

    转载:http://www.cnblogs.com/newwind521/archive/2010/11/25/1887203.html sql 行专列 列转行 普通行列转换 /* 标题:普通行列转换 ...

  6. kettle——入门操作-行列转换(行转列,字段拆分)

      1.Row Normaliser,将一行多列数据转换为多行一列数据. 输入数据流: 计算器配置如下: 与计算器相连接的excel输出如下: Row Normaliser,设置如下, 与Row No ...

  7. LinQ实现DataTable不定行转列 行列转换,有图

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="LinqDemo2.aspx.c ...

  8. PowerBI/Excel - PowerQuery数据转换系列 - 如何将多行的值串联到一行 - 行列转换

    Power Query 是做数据转换.数据清洗的利器,不管是在Excel还是PowerBI,如何玩好Power Query是成功建模的必不可少的一步. 今天要get到的一个新技巧:行列转换 如何将多行 ...

  9. mysql行转列转换

    http://blog.csdn.net/sinat_27406925/article/details/77507478 mysql 行列转换 ,在项目中应用的极其频繁,尤其是一些金融项目里的报表.其 ...

随机推荐

  1. DataProvider 传递参数

    package roger.testng; import org.testng.annotations.DataProvider; import org.testng.annotations.Test ...

  2. Api项目压力测试知识荟萃

    并发用户.在线用户和注册用户以及彼此之间的换算方法(估算模型).系统的最大并发用户数根据注册用户数来获得,换算方法一般是注册总人数的5%-20%之间:系统的并发数根据在线人数来获得,换算方法一般是在3 ...

  3. C#中属性简写原理

    1. 属性简写时不能只有get或者set 原因: 如果只有get,那么没有办法给其赋值,所有也就没法get到值: 如果只有set,没有意义,因为根本没法获取到这个值.

  4. 跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码

    跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码 第一步:插入QQ摄像头,安装好驱动(有的可能免驱动) 第二步:打开HDevelop,点击助手-打开新的Image Acquisitio ...

  5. JZ2440开发笔记(4)——设置静态IP

    1. 配置静态ip地址 $sudo vim /etc/network/interfaces 原有内容只有如下两行: auto lo iface lo inet loopback 向末尾追加以下内容: ...

  6. lua部分 tips

    lua文件刷新 function require_ex( _mname ) if _mname == "" then return end if package.loaded[_m ...

  7. 【CSS】Beginner1:Applying CSS

    CSS(Cascading Style Sheets)   1.Applying CSS Three ways: 1.In-line 2.Internal 3.External   2.In-line ...

  8. RTCP

    RTCP RTCP协议将控制包周期发送给所有连接者,应用与数据包相同的分发机制.低层协议提供数据与控制包的复用,如使用单独的UDP端口号.RTCP执行下列四大功能: (1) 主要是提供数据发布的质量反 ...

  9. 解决SQL数据库无法脱机的问题

    数据库无法脱机:原理——有人在占用. 解决办法: select * from master.sys.sysprocesses where dbid=db_id('数据库名称') kill [id]

  10. Find longest contiguous sub array

    It's still an Amazon interview question. Given an array containing only stars '*' and hashes '#' . F ...