SQL server 纵横报表查询

news2024/11/28 16:03:56

select warehouseid AS 仓库,

case when Udf2 = 'SAP' THEN 'SAP'

WHEN Udf2 = 'SNC' THEN 'SNC'

ELSE '手工创建' end AS 创建来源 ,COUNT(isnull(UDF2,'手工创建')) AS 数量 from DOC_Appointment_Header dah

where convert(varchar(10),AddTime,120) >= '2022-09-01' --and warehouseid = '221'

GROUP by

case when Udf2 = 'SAP' THEN 'SAP'

WHEN Udf2 = 'SNC' THEN 'SNC'

ELSE '手工创建' end ,

warehouseid

希望将以上数据按照以下格式查询出来

SNCSAP手工创建
A2323234213
B132413
C3423521

 

查询语句:

select

t2.仓库,t2.SNC,t2.SAP,t2.手工创建 from

(select warehouseid AS 仓库,

case when Udf2 = 'SAP' THEN 'SAP'

WHEN Udf2 = 'SNC' THEN 'SNC'

ELSE '手工创建' end AS 创建来源 ,COUNT(isnull(UDF2,'手工创建')) AS 数量 from DOC_Appointment_Header dah

where convert(varchar(10),AddTime,120) >= '2022-09-01' --and warehouseid = '221'

GROUP by

case when Udf2 = 'SAP' THEN 'SAP'

WHEN Udf2 = 'SNC' THEN 'SNC'

ELSE '手工创建' end ,

warehouseid ) as t1

pivot (sum(数量) for 创建来源 in(SNC,SAP,手工创建)) as t2

效果如下:

参考帖子:本文来自博客园,作者:AfreadHuang,转载请注明原文链接:https://www.cnblogs.com/simple-blog/p/4371240.html

在平常的工作中或者面试中,我们可能有遇到过数据库的纵横表的转换问题。今天我们就来讨论下。

1.创建表

  首先我们来创建一张表。

sql语句:

 1 --1. 创建数据表
 2 if OBJECT_ID('Score') is not null drop table Score
 3 
 4 create table Score
 5 (
 6     姓名 nvarchar(128),
 7     课程 nvarchar(128),
 8     分数 int
 9 )
10 
11 insert into Score values('张三','语文',98)
12 insert into Score values('张三','数学',89)
13 insert into Score values('张三','物理',78)
14 insert into Score values('李四','语文',79)
15 insert into Score values('李四','数学',88)
16 insert into Score values('李四','物理',100)
17 
18 select * from Score

执行结果:

2. 传统的纵横表转换

2.1 纵表转横表

先看看我们要转成的横表张什么样子:

既然这个表只有两列,那么可以根据姓名进行分组。先把姓名拼凑出来,后面的分数我们再想办法。

sql:

select t.姓名 2 from Score as t 3 group by t.姓名 

结果:

分析:

  1. 我们先拿到语文这个科目的分数。既然我们用到了group by 语句,这里肯定要用聚合函数来求分数。
  2. 而且我们只需要语文这一科的成绩,分组出来的 一共有 3列 ,分别是 语文、数学、物理  。  那么就需要判断科目来取分数。

  这里符合我们需求的 case 语句就登场了。他和c#中switch-case 作用一样。

sql case 语句语法: 

case 字段
    when 值1 then 结果
    when 值2 then 结果2
    ...
    else 默认结果
end 

求语文的分数就简单了:

select t.姓名,
SUM(case t.课程 when '语文' then t.分数 else 0 end) as 语文
from Score as t
group by t.姓名

结果:

既然语文的分数取到了,其他科目改变下条件就可以了。

完整的sql:

select t.姓名,
SUM(case t.课程 when '语文' then t.分数 else 0 end) as 语文,
SUM(case t.课程 when '数学' then t.分数 else 0 end) as 数学,
SUM(case t.课程 when '物理' then t.分数 else 0 end) as 物理
from Score as t
group by t.姓名

OK,到这儿,我们传统方式的纵表转横表就大功告成了。

2.2 横表转纵表

那么我们可以把转换过来的横表再转换回去吗?  

我们先把刚刚转好的表,插入一个新表ScoreHb 中。

1 -- 转换的表插入新表
2 select t.姓名,
3 SUM(case t.课程 when '语文' then t.分数 else 0 end) as 语文,
4 SUM(case t.课程 when '数学' then t.分数 else 0 end) as 数学,
5 SUM(case t.课程 when '物理' then t.分数 else 0 end) as 物理
6 into ScoreHb
7 from Score as t
8 group by t.姓名

这时ScoreHb 就是我们刚转换好的横表,我们再想办法把他转回来。

怎么转呢? 一步步来。我们也先把张三和李四的语文成绩查出来。

sql:

1 --张三李四语文的分数
2 select t.姓名,
3 '语文' as 课程,
4 t.语文 as 分数
5 from ScoreHb as t

结果:

还有两科的数据怎么办呢? 很简单,我们一个个都查出来,然后用 union all 把他们组合为一张表就可以了。

sql:

 1 -- union all链接3个科目
 2 select t.姓名,
 3 '语文' as 课程,
 4 t.语文 as 分数
 5 from ScoreHb as t
 6 union all
 7 select t.姓名,
 8 '数学' as 课程,
 9 t.数学 as 分数
10 from ScoreHb as t
11 union all
12 select t.姓名,
13 '物理' as 课程,
14 t.物理 as 分数
15 from ScoreHb as t
16 order by t.姓名 desc

结果:

这样,我们就把表又变回去了。

但是大家有没有觉得很麻烦呢?别急,我们有更简单的办法。下面为大家介绍pivot关系运算符。

3. 用pivot和unpivot运算符进行转换

  pivot是sql server 2005 提供的运算符,所以只要数据库在05版本以上的都可以使用。主要用于行和列的转换。

3.1 pivot纵表转横表

sql:

1 select
2     t2.姓名,
3     t2.数学,
4     t2.物理,
5     t2.语文
6 from Score as t1
7 pivot (sum(分数) for 课程 in(数学,语文,物理)) as t2

结果:

是不是代码简洁多了。

pivot将原来表中 课程字段中的 数据行 数学,语文,物理 转换为列,并用sum取对应列的值。

我们只需要记住它的用法就可以了。

3.2 unpivot 横表转纵表

既然有privot可以纵表转横表。那么有没有运算符帮我们转回来呢?

答案是肯定的,他就是unpivot

sql:

1 select
2     *
3 from
4 ScoreHb
5 unpivot (分数 for 课程 in (语文,数学,物理)) as t4

结果:

 unpivot 将 语文,数学,物理 列转为行,分数为新的一列存放对应的值。

 是不是比我们之前一个个表查询拼接,方便了很多。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/528599.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ASEMI代理ADI亚德诺ADP5054ACPZ-R7供电管理芯片介绍

编辑-Z 本文主要介绍ADP5054ACPZ-R7供电管理芯片的基本特性和应用场景。该芯片支持多路输出,具有高效和可靠性的特点,适用于各种电力系统和工业控制设备。 1、ADP5054ACPZ-R7的基本特性 ADP5054ACPZ-R7是一款高度集成的供电管理芯片,具有以…

python argparse 模块命令行参数解析

1.概述 argparse 是 python 的一个命令行解析包,可根据需要编写高可读性的程序。本文针对项目中对 argparse 的用法,用实例对各个参数进行讲解,力求达到让读者秒懂的目的。 2.api概述 2.1 ArgumentParser 对象 class argparse.ArgumentPar…

msvcr120.dll丢失怎样修复?msvcr120.dll丢失修复的四个方法

打开软件跟游戏提示msvcr120.dll丢失,无法执行此代码怎么办?刚刚遇到这个问题,我都无从下手。家人们,你是不是也被这个问题也困扰过。msvcr120.dll是什么文件呢?经过我一个下午的时间研究,终于搞清楚了&…

在 Mac 上的“终端”中执行.out文件

在 Mac 上的“终端”中执行.out文件 安装C及设置C语言环境怎么运行 安装C及设置C语言环境 最近在自学C语言,因为用的是mac电脑(MacBook Air M1),自带了C语言环境,如果用的是windows系统,可能这篇文章对您没有一点帮助…

10年软件测试人劝你千万别上当,测试岗位就是个巨坑......

每次都有人问我软件测试的前景是什么样的,每年也会有人很多人纷纷涌入测试的岗位上,希望自己能够进入阿里、华为等大厂。 但是测试岗位真的那么吃香吗?今天我结合从零基础小白到测试开发的成长经历,来说下这个行业的发展前景&…

基于改进MRAS算法的永磁同步电机参数辨识

基于改进MRAS算法的永磁同步电机参数辨识 摘 要永磁同步点电机参数辨识算法介绍永磁同步电机数学模型改进MRAS参数辨识算法递推最小二乘法辨识原理递推最小二乘法结合MRAS算法原理仿真结果分析总结 摘 要 在永磁同步电机运行时,电机的电气参数会受到温度以及磁链饱…

KDZD400Q便携式三氯乙烯浓度检测仪

一、产品概述 检测仪用于快速检测多种气体浓度、温湿度测量并超标报警的场合。采用2.31寸高清彩屏实时显示,选用进口品牌的气体传感器,主要检测原理有:电化学、红外、催化燃烧、热导、PID 光离子等。 可以检测管道中或受限空间、大气环境中的…

领英的大败退,是对本土化的深刻误解

领英似乎还没思考清楚,本土化到底意味着什么? 2023年5月9日,领英宣布本土化求职平台领英职场将在8月9日停止服务。据了解,领英职场于去年12月14日上线,上线不到半年就将下线,比领英之前推出的赤兔更“短命…

Java【网络原理1】什么是 TCP/IP 五层模型? 数据传输的封装和分用?

文章目录 前言一、网络协议分层二、数据的网络传输1, 封装2, 分用3, 实际情况 总结 前言 📕各位读者好, 我是小陈, 这是我的个人主页 📗小陈还在持续努力学习编程, 努力通过博客输出所学知识 📘如果本篇对你有帮助, 烦请点赞关注支持一波, 感…

文本三剑客:sed编辑器

sed编辑器 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。 工作流程 sed 的工作流程主要…

Python时间模块:time和datetime的区别与用法

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 目录标题 前言一. Python中表示时间的两种方式:二. time三. datetime1. datetime.datetime2.datetime.timedelta 尾语 💝 一. Python中表示时间的两种方式: 时间戳:相对于197…

Java PECS(Producer Extends Consumer Super)原则

在看 Alibaba 开发手册时遇到 PECS 原则,刚开始阅读时感觉比较绕,也搜索了一些博文参考,个人觉得 Stackoverflow 的这篇文章比较实用 —— What is PECS (Producer Extends Consumer Super)? 后面结合 JDK 源码梳理了下 // java/util/List…

电脑压缩包文件不见了怎么办?2种办法轻松找回电脑丢失文件!

一般情况下,为了节省磁盘空间或者传送文件时能够更快点,我们都会选择把文件进行压缩,这样会更加方便。 但时间一长,由于各种各样的原因,比如: 清理积累下来的压缩包时不小心把需要的压缩文件删除了&#x…

Angular与PDF之三: 服务器端渲染PDF

一、Angular PDf server 端渲染 1. 环境准备 _ _ ____ _ ___/ \ _ __ __ _ _ _| | __ _ _ __ / ___| | |_ _|/ △ \ | _ \ / _ | | | | |/ _ | __| | | | | | | / ___ \| | | | (_| | |_| | | (_| | | | |___|…

RK 平台MIPI 点屏注意事项

转自:https://www.cnblogs.com/chorm590/p/11658360.html rk 平台关于 MIPI 屏幕的点屏流程已经非常完善了,基本上只要确定了硬件没问题、接线没问题、屏幕没问题,再稍稍配置一下 dtsi 里的参数就可以的了。 MIPI 点屏流程大致可以概括为以下…

一步一步教你写kubernetes sidecar

什么是sidecar? sidecar,直译为边车。 如上图所示,边车就是加装在摩托车旁来达到拓展功能的目的,比如行驶更加稳定,可以拉更多的人和货物,坐在边车上的人可以给驾驶员指路等。边车模式通过给应用服务加装一…

Python命名空间和作用域

命名空间定义了在某个作用域内变量名和绑定值之间的对应关系,命名空间是键值对的集合,变量名与值是一一对应关系。作用域定义了命名空间中的变量能够在多大范围内起作用。 命名空间在python解释器中是以字典的形式存在的,是以一种可以看得见…

OCPC系列三 - 展开说说广告业务及算法介绍

系列分享: OCPC系列 - OCPC介绍扫盲贴来啦_高阳很捷迅的博客-CSDN博客 OCPC系列 - PID算法(理解PID算法)-比例控制算法、积分控制算法、微分控制算法_高阳很捷迅的博客-CSDN博客 名词解释 先简单介绍下以下名称解释,方便下面阅…

Flink基础介绍-1 概述

Flink基础介绍-1 概述 一、Flink介绍1.1 批处理计算引擎1.2 流式计算引擎1.3 批处理和流处理 一、Flink介绍 Flink 是为分布式、高性能、随时可用以及准确的流处理应用程序打造的开源流处理框架。Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状…

PDF转HTML格式怎么弄?将PDF转换为HTML的三种简便方法

PDF和HTML是两种常见的文档格式,它们在用途和外观上有很大的差异。然而,令人惊讶的是,这两种看似毫不相关的格式实际上可以相互转换。 一些网页编辑人员在更新网站内容时,通常会先将内容保存为PDF文件,然后在发布时将…