如何把sqlserver中的列转换成行,行转换成列,显示

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何把sqlserver中的列转换成行,行转换成列,显示相关的知识,希望对你有一定的参考价值。

参考技术A create database arron
go
use arron
go

-- createTable init Data
create table students (
name varchar(25),
class varchar(25),
grade int
)
insert into students values ('张三','语文',20)
insert into students values ('张三','数学',90)
insert into students values ('张三','英语',50)
insert into students values ('李四','语文',81)
insert into students values ('李四','数学',60)
insert into students values ('李四','英语',90)

-- solution1
select * from students
pivot(
max(grade)
FOR [class] IN ([语文],[数学],[英语])
) AS pvt

-- solution2 相当于自连接

select A.Name,A.grade as 语文,B.grade as 数学,C.grade as 英语
from students A,students B,students C
where A.Name=B.Name and B.Name=C.Name
and A.class='语文' and B.class='数学'
and C.class='英语'

-- solution3
select name,
max(case when s.class='语文' then s.grade end) as 语文,
max(case when s.class='数学' then s.grade end) as 数学,
max(case when s.class='英语' then s.grade end) as 英语
from students s group by name

--在有id 的情况下
create table students2 (
id int primary key identity(1,1),
name varchar(25),
class varchar(25),
grade int
)

insert into students2 values ('张三','语文',20)
insert into students2 values ('张三','数学',90)
insert into students2 values ('张三','英语',50)
insert into students2 values ('李四','语文',81)
insert into students2 values ('李四','数学',60)
insert into students2 values ('李四','英语',90)

-- 原先的solution1(有问题)
select * from students2
pivot(
max(grade)
FOR [class] IN ([语文],[数学],[英语])
) AS pvt
-- 原先的solution2 (ok)
select A.Name,A.grade as 语文,B.grade as 数学,C.grade as 英语
from students A,students2 B,students2 C
where A.Name=B.Name and B.Name=C.Name
and A.class='语文' and B.class='数学'
and C.class='英语'
-- 原先的solution3 (ok)
select name,
max(case when s.class='语文' then s.grade end) as 语文,
max(case when s.class='数学' then s.grade end) as 数学,
max(case when s.class='英语' then s.grade end) as 英语
from students s group by name

--unpivot 函数使用
create table test1(id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int)
insert into test1 values(1,'a',1000,2000,4000,5000)
insert into test1 values(2,'b',3000,3500,4200,5500)

--实现的sql
select * from test1

select id ,[name],[jidu],[xiaoshou] from test1
unpivot
(
xiaoshou for jidu in
([q1],[q2],[q3],[q4])
)
as f

--- 以下的sql 可以替换上面的sql
select id,[name],
jidu='Q1',
xiaoshou=(select Q1 from test1 where id=a.id)
from test1 as a
union
select id,[name],
jidu='Q2',
xiaoshou=(select Q2 from test1 where id=a.id)
from test1 as a
union
select id,[name],
jidu='Q3',
xiaoshou=(select Q3 from test1 where id=a.id)
from test1 as a
union
select id,[name],
jidu='Q4',
xiaoshou=(select Q4 from test1 where id=a.id)
from test1 as a

如何在不使用数据透视的情况下将行转换或转置为 SQL 中的列?

【中文标题】如何在不使用数据透视的情况下将行转换或转置为 SQL 中的列?【英文标题】:How to convert or transpose rows to columns in SQL without using pivot? 【发布时间】:2021-06-29 12:47:24 【问题描述】:

我在 SQL 中转置数据时遇到了一个问题。例如下面给出的表格

id source_name value
1 cp x
1 cp y
1 hi a
2 li b
2 cp c
2 li d
3 li e

我需要以下格式的表格(转置但带有字符串聚合)-

id cp hi li mi
1 x,y a null null
2 c null b,d null
3 null null null d

使用当前的 sql 查询,我得到以下格式的表格。

id cp hi li mi
1 x a null null
2 c null b null
3 null null null d

任何人都可以在 SQL(平台 - Bigquery)中调整查询或建议新查询吗?

当前查询 -

select id, any_value(if(source_name = 'cp', value, null)) as cp,
any_value(if(source_name = 'hi', value, null)) as hi,
any_value(if(source_name = 'li', value, null)) as li
any_value(if(source_name = 'mi', value, null)) as mi
from table_name group by id

【问题讨论】:

只是好奇-为什么without using pivot?你有什么用例不想做最好的方式(这是枢轴)? :o) 【参考方案1】:

改用PIVOT operator

select *
from `project.dataset.table`
pivot (string_agg(value) for source_name in ('cp', 'hi', 'li', 'mi'))    

如果应用于您问题中的样本数据

输出是

如果您想让它为您动态构建列列表,请查看https://***.com/a/67479622/5221944

【讨论】:

【参考方案2】:

尝试STRING_AGG 而不是any_value

select id, string_agg(if(source_name = 'cp', value, null)) as cp,
string_agg(if(source_name = 'hi', value, null)) as hi,
string_agg(if(source_name = 'li', value, null)) as li
string_agg(if(source_name = 'mi', value, null)) as mi
from table_name group by id

【讨论】:

以上是关于如何把sqlserver中的列转换成行,行转换成列,显示的主要内容,如果未能解决你的问题,请参考以下文章

SQL 如何把一列的值转换成一行显示

c#如何把Json转成DataTable每一行都一一对应下面多出来的列自动添加到后方

HTML中 块级元素 如何转为 行内元素??

临时表中行列直接的装换

sql开发技巧总结-2

怎样把DataTable中的一列数据转换成数组