当前位置:首页 » 编程语言 » sql行转换成列
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql行转换成列

发布时间: 2023-01-22 23:21:51

sql 行列转换

前段时间有人问了一个问题,就是SQL的行列转换,当时有点懵没答上来,后来细细想一想,其实最近的一个项目就已经用到了。
基础数据如下:

要求根据当年的月份去统计出每一个ID的汇总金额。就是把行中的月切换到列中。
最后效果如下:

参考资料: https://technet.microsoft.com/zh-cn/library/ms177410(v=sql.105).aspx#%E5%A4%8D%E6%9D%82%20PIVOT%20%E7%A4%BA%E4%BE%8B

带批注的 PIVOT 语法。

如果聚合函数与 PIVOT 一起使用,则计算聚合时将不考虑出现在值列中的任何空值。

新建两张表

查询结果

--UNPIVOT 函数

--单纯用SQL 处理 ,原理很简单,就是对每个需要置换的列单独处理出来

最终效果:

--用上面的结果新建表

--PIVOT

-- SQL直接处理,先用CASE 语句将每行处理出来,然后在用聚合去处理合并相同ID的行。

㈡ sql中一对多关系的查询结果的多行转换成一行多列

1、创建测试表,

create table test_fee(userid number, feeid number, fee number);

㈢ SQL行列转换

SQL2000:

use Tempdb
go
--> -->

if not object_id(N'A') is null
drop table A
Go
Create table A([ID] nvarchar(5),[Name] nvarchar(4),[Age] int,[Sex] nvarchar(10))
Insert A
select N'a01',N'张三',19,N'男' union all
select N'a02',N'李四',20,N'女' union all
select N'a03',N'王五',21,N'男'
Go

if not object_id(N'B') is null
drop table B
Go
Create table B([表名] nvarchar(20),[列名] nvarchar(20),[字段长度] int,[字段组合] nvarchar(10))
Insert B
select N'A',N'ID',5,N'组合' union all
select N'A',N'Name',4,N'中文' union all
select N'A',N'Age',3,N'数字' union all
select N'A',N'Sex',2,N'选择'
Go
--表名='A'(也就是A表), A表的ID='a01'
declare @TableName sysname,@ID nvarchar(10)
select @TableName='A',@ID='a01'

declare @S1 nvarchar(4000)

select @S1=isnull(@S1+' union all ','')+'select [列名]='+quotename(Name,'''')
+',[列字段]= cast('+quotename(Name)+' as nvarchar(10)) from ['+@TableName+'] where ID='''+@ID+''''
from syscolumns where ID=object_id(@TableName)
exec(

'select b.[列名], a.[列字段],b.[字段长度], b.[字段组合] from ('+@S1+N')a inner join B on a.[列名]=b.[列名] where b.[表名]='''+@TableName+'''')

/*
列名 列字段 字段长度 字段组合
ID a01 5 组合
Name 张三 4 中文
Age 19 3 数字
Sex 男 2 选择
*/

㈣ sql 行变成列

declare@snvarchar(4000)
select@s=isnull(@s+',','')+quotename(Name)
fromsyscolumnswhereID=object_id('aa')
orderbyColid
exec('selectid,namefromaaunpivot(nameforidin('+@s+'))b')

如图:

㈤ sql 行转列

SELECT DISTINCT
(SELECT a FROM tab WHERE b = '未知'),
(SELECT a FROM tab WHERE b = '输入为空'),
(SELECT a FROM tab WHERE b = 'cc')
FROM tab
UNION ALL
SELECT
cast((SELECT a FROM tab WHERE b = '未知') / t.sumA AS DECIMAL(3, 1)),
(SELECT a FROM tab WHERE b = '输入为空') / t.sumA,
(SELECT a FROM tab WHERE b = 'cc') / t.sumA
FROM (SELECT SUM(a) AS sumA FROM tab) t

这里cast((SELECT a FROM tab WHERE b = '未知') / t.sumA AS DECIMAL(3, 1)), 不同SQL方言转化方式不一样,目的是为了转换成小数

㈥ SQL行转列,列转行

行列转换在做报表分析时还是经常会遇到的,今天就说一下如何实现行列转换吧。

行列转换就是如下图所示两种展示形式的互相转换

假如我们有下表:

通过上面 SQL 语句即可得到下面的结果

PIVOT 后跟一个聚合函数来拿到结果,FOR 后面跟的科目是我们要转换的列,这样的话科目中的语文、数学、英语就就被转换为列。IN 后面跟的就是具体的科目值。

当然我们也可以用 CASE WHEN 得到同样的结果,就是写起来麻烦一点。

使用 CASE WHEN 可以得到和 PIVOT 同样的结果,没有 PIVOT 简单直观。

假设我们有下表 student1

通过 UNPIVOT 即可得到如下结果:

我们也可以使用下面方法得到同样结果

㈦ SQL 行转列

我这里两种都给你介绍,行转列和列转行:

列转行——

录入经营范围时候会遇到列传行的问题解决方案如下:

在temp1 表有一下字段内容:

㈧ SQL语句行转列

根据楼主的描述,特为楼主总结如下,在SqlServer里面行列转换的语法一般是: select 字段, sum(case when 要转换的行单元格的字段名='行字段内容' then 聚合的字段名 end ) as 自定义的列标题1 from 表的名字 group by 字段(注意,分组聚合就是根据这个字段来的,具体到楼主的问题,这里的字段就应该是org_id) 如果有多个列,之间用逗号隔开就可以了,最后一个参数和from之间不要用逗号。 具体到楼主的显示效果就可以这样写了。代码参考如下: Select org_id , sum(case when channel ='团险' then PREM end) As '团险保费' , sum(case when channel ='个险' then PREM end) As '个险保费 From 你的表名 Group By org_id

㈨ sql行转列

SELECT e.NAME as name,
count(case when DATEPART(year,c.START_TIME)=2014 then 1 else null end ) as count2014,
count(case when DATEPART(year,c.START_TIME)=2015 then 1 else null end ) as count2015
from ENVI_DATA_STATISTIC_COMP c
LEFT JOIN ENVI_CITY e on e.CITY_ID=c.CITY_ID
where c.COMP_NAME like '%蓝天白云%' and INDEX_TYPE='12'
and (c.START_TIME like '%2014-08%' or c.START_TIME like '%2015-08%' ) and STATISTIC_TYPE='1' and c.VALID_FLAG='1'
group by name

应该是酱紫的,使用case when 转换~