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

关键字: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

转载于:https://www.cnblogs.com/tfiremeteor/p/5519910.html

Sql2008的行列转换之行转列相关推荐

  1. 2021年大数据Hive(五):Hive的内置函数(数学、字符串、日期、条件、转换、行转列)

    全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 Hive的内置函数 一.数学函数 1. 取整函数: round ...

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

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

  3. SQL ON Hadoop-Hive(六)-字符串函数+行列转换

    一.hive常用字符串函数 1.字符串反转函数reverse(string A) --返回值类型stringselect reverse('gian') from iteblog; --'naig'2 ...

  4. Mysql实现行列转换

    mysql数据库如何实现行列转换 1. 行转列: 方案一: select name, sum(case when course='java' then grade end) as java, sum( ...

  5. Oracle 行转列

    一.简易运用 -->没转之前一个主号绑定多个副号的多行输出(像移动的欢乐在线) SELECT   f.town_name 镇区,           f.school_name 学校,      ...

  6. Oracle 行列转换

    Oracle 行列转换 1.固定列数的行列转换 如 student subject grade --------- ---------- -------- student1 语文 80 student ...

  7. Excel行列转置(行数据与列数据的转换)

    Excel行列转换的方法就是选择性粘贴. 将以行形式存储的数据复制后,选中其他空白单元格,右键,选择"选择性粘贴",打开"选择性粘贴"对话框,勾选"转 ...

  8. oracle10行转列,【转】oracle 10g 行列转换的写法

    11g中有更好的解决方式,有个pivot函数 1 假如有如下表,其中各个i值对应的行数是不定的SQL> select * from t; I A D ---- ---- ------- 1 b ...

  9. mysql行转列transform_MySQL学习之行列转换案例

    前言 Oracle中的pivot/unpivot函数可以很方便的帮助我们实现行列转换,但是MySQL并不支持. 可以在SQL上想办法,比如pivot考虑用聚合函数+case when, unpiovt ...

最新文章

  1. 基于JSP的开题报告定做
  2. 今天,小程序正式支持 SVG
  3. ML之LoRDTRF:基于LoRDT(CART)RF算法对mushrooms蘑菇数据集(22+1,6513+1611)训练来预测蘑菇是否毒性(二分类预测)
  4. 【转】根据起止日期+时间取数
  5. Linux文件系统及磁盘分区与格式化(二次排版)
  6. Leedcode6-binary-tree-preorder-traversal
  7. wire 和 reg_Wire和Launchkit开源,水流监控系统以及更多新闻
  8. 基于java的打砖块游戏_cocos creator 制作的打砖块游戏
  9. AngularJS 后台交互
  10. 论文阅读笔记(audio-visual相关)—Co-Separating Sounds of Visual Objects
  11. Docker - 配置国内加速器加速镜像下载
  12. 讯为4412蜂鸣器驱动实现
  13. python代码编辑器
  14. 【noip模拟赛1】古韵之鹊桥相会(最短路)
  15. ubuntu禁止指定软件包更新
  16. MMWHS-文献阅读(图像分割)
  17. 传腾讯计划出售美团全部股权,知情人士辟谣;苹果证实iOS 16要大量推送广告;Linux 6.0-rc1 发布|极客头条...
  18. 教育直播系统如何开发?
  19. 【学海】再看傅里叶变换和欧拉公式
  20. devmem读写物理内存

热门文章

  1. python简单好看的代码_Python新手写出漂亮的爬虫代码1
  2. python字典更新值_Python 字典 update() 使用方法及示例
  3. python两数相加取_Leetcode_两数相加_Python
  4. 分割svm的超平面数学特征
  5. 如何用df的两列作复杂的运算
  6. jacobi迭代法matlab_解线性方程组的经典迭代法(1)-理论
  7. 嵌入式linux 配置usb otg,嵌入式系统设计中的USB OTG方案
  8. Systemctl stop XXX 时间太长
  9. android p新功能_android 11今天发布这是新功能
  10. 笔记-项目整体管理-变更管理-变更管理的原则