SQL- 行转列,多行转多列 - max 函数
效果如图,把同一个 code, 按 cate 列分为 Actual 和 Budget 两行,再把mode 每种类型转换成 列名 ,主要用到了 max 函数,很实用

if exists(select * from tempdb..sysobjects where id=object_id('tempdb..#t'))
drop table #t
create table #t(
code varchar(10),
cname nvarchar(30),
fyear varchar(30),
cate varchar(10),
mt numeric(18,4),
amt numeric(18,2),
mode nvarchar(20),
mo_mt numeric(18,4),
mo_avgfee numeric(18,2),
mo_rate nvarchar(20)
)
insert into #t
select '',N'深圳','','Actual','','','BLK',10,1,'3.57%'
union all select '',N'深圳','','Actual','','','V15',20,2,'7.14%'
union all select '',N'深圳','','Actual','','','V5',30,3,'10.71%'
union all select '',N'深圳','','Actual','','','V0',40,4,'14.29%'
union all select '',N'深圳','','Actual','','','V20',50,5,'17.86%'
union all select '',N'深圳','','Actual','','','V10',60,6,'21.43%'
union all select '',N'深圳','','Actual','','','V25',70,7,'25.00%'
union all select '',N'深圳','','Budget','','','BLK',10,1,'3.57'
union all select '',N'深圳','','Budget','','','V15',20,2,'7.14%'
union all select '',N'深圳','','Budget','','','V5',30,3,'10.71%'
union all select '',N'深圳','','Budget','','','V0',40,4,'14.29%'
union all select '',N'深圳','','Budget','','','V20',50,5,'17.86%'
union all select '',N'深圳','','Budget','','','V10',60,6,'21.43%'
union all select '',N'深圳','','Budget','','','V25',70,7,'25.00%'
select * from #t
--增加一个强制mode 排序,比如从 vo v1 v2 依次排序
if exists(select * from tempdb..sysobjects where id=object_id('tempdb..#sort'))
drop table #sort
create Table #sort
(
mode varchar(10),
)
insert into #sort
select distinct mode FROM #t GROUP BY mode order by mode
-- select * from #sort
declare @sql nvarchar(max) --声明一个变量
SET @sql = '
SELECT code '
+',cname '
+',fyear '
+',cate ' --+ N'''类别'''
+',isnull(mt,0) mt' -- + N'''吨数'''
+',isnull(amt,0) amt' -- + N'''金额'''
select @sql = @sql + ' , max(case mode when ''' + mode+ ''' then mo_rate else '''' end) [' + mode+ ']'
+ ' , max(case mode when ''' + mode+ ''' then mo_avgfee else 0 end) [' + mode+ '_unit]'
from (select mode FROM #sort ) as a
--print @sql
set @sql = @sql + ' from #t group by code, cname,fyear,cate,mt,amt order by code,fyear '
print @sql
exec(@sql) --执行该sql
SQL- 行转列,多行转多列 - max 函数的更多相关文章
- SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段: 方法二:使用拼接SQL, ...
- 微软BI 之SSIS 系列 - 在 SQL 和 SSIS 中实现行转列的 PIVOT 透视操作
开篇介绍 记得笔者在 2006年左右刚开始学习 SQL Server 2000 的时候,遇到一个面试题就是行转列,列转行的操作,当时写了很长时间的 SQL 语句最终还是以失败而告终.后来即使能写出来, ...
- T SQL 将一列多行数据合并为一行
SQL Server 在进行数据迁移和报表处理的时候遇到将一列多行数据拼接为一个字符串的情形,查找相关的资料整理如下,提供两种方法. Table:SC Student Course 张三 大学语文 李 ...
- SQL Server:使用 PIVOT 行转列和 UNPIVOT 列转行
ylbtech-SQL Server:使用 PIVOT 行转列和 UNPIVOT 列转行 可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表.PIVOT 通过将表达式某一列 ...
- 在mybatis中使用存储过程报错java.sql.SQLException: ORA-06550: 第 1 行, 第 7 列: PLS-00905: 对象 USER1.HELLO_TEST 无效 ORA-06550: 第 1 行, 第 7 列:
hello_test是我的存储过程的名字,在mapper.xml文件中是这么写的 <select id="getPageByProcedure" statementType= ...
- Sql 行转换为列 以及列转换为行的心得
这是 创建数据库的脚本文件 CREATE TABLE [dbo].[stu]( [学号] [nvarchar](255) NOT NULL, [姓名] [nvarchar](255) NULL, [性 ...
- 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)
原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)
原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...
- 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)
原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串)
原文:在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
随机推荐
- CentOS 7 下安装 teamviewer 13
CentOS 版本:centos-release-7-4.1708.el7.centos.x86_64(通过 rpm -q centos-release 查询) teamviewer 版本:teamv ...
- Mybatis 通用 Mapper 和 Spring 集成
依赖 正常情况下,在原有依赖基础上增加的 mapper-spring. <!-- https://mvnrepository.com/artifact/tk.mybatis/mapper-spr ...
- ZOJ Monthly, March 2018
A. Easy Number Game 贪心将第$i$小的和第$2m-i+1$小的配对即可. #include<cstdio> #include<algorithm> usin ...
- centos官网下载地址
CentOS 7官方下载地址:https://www.centos.org/download/ 源自博友的博客:https://blog.csdn.net/yf9595/article/details ...
- react-native添加react-native-vector-icons插件android遇到的问题
问题 yarn add react-native-vector-icons后图省事使用react-native link来添加native配置,结果run时报错. ps:安装的需要native的插件不 ...
- ECMA Script 6_Generator
Genertor 是一个普通函数,但是有两个特征: function 关键字 与 函数名之间有一个星号: 函数体内部使用 yield 表达式,定义不同的内部状态(yield 在英语里的意思就是“产出 ...
- Java中的字符串截取(substring)的使用
import java.util.*; public class ZiFu { public static void main(String args[]){ System.out.println(& ...
- PHP的运算符
1.算术运算符 2.赋值运算符 基本的赋值运算符是“=”. (1)引用赋值 PHP 支持引用赋值,使用“$var = &$othervar;”语法.引用赋值意味着两个变量指向了同一个数据,没有 ...
- 电子产品使用感受之-- AirPods + Apple Watch S4 = Smart iPod ?
- 华大单片机开发板HC32F030上手入门
HC32F030开发板(如下图所示)分为板载调试模块(左半部分)和MCU开发电路(右半部分).二者中间通过邮票孔相连,如果将板子从中间掰开,板载调试模块就可以当一个CMSIS-DAP的仿真器来使用.此 ...