如何解决将多列数据合二为一的 SQL 数据透视表,逗号分隔
SQL 查询表:
Date Production LineName Buyer Style
2021-04-30 100 A Lev 1a
2021-04-30 200 B Kont 2d
2021-04-30 300 C ABB 4l
2021-04-30 400 A Lev 1a
2021-04-29 600 A BDA 3z
输出需要像:
LineName 2021-04-29 2021-04-30
A 600,BDA,3Z 500,Lev,1a
B NULL 200,Kont,2d
C NULL 300,ABB,4l
我开始编码并停留在
DECLARE @query VARCHAR(4000),@Dates VARCHAR(4000)
SET @Dates = STUFF((
SELECT DISTINCT '],[' + Cast([Date] As Varchar)
FROM Table_17M
ORDER BY '],[' + Cast([Date] As Varchar)
FOR XML PATH('')
),1,2,'') + ']'
SET @query = ';With PivotData
As
(
Select
LineName,-- grouping element
[Date],-- spreading element
PlanProduction-- aggregating element
From Table_17M
)
Select *
From PivotData
Pivot (Sum(PlanProduction) For [Date] In (' + @Dates + ')) As P;'
EXEC (@query);
任何想法请分享。这将非常有帮助。谢谢。
解决方法
如果您使用的是 SQLServer 2017 或更高版本,则使用 string_agg() 而不是 suff()。实施起来更容易,速度也更快。
select @cols= string_agg(quotename([date]),',') from (select distinct [date] from Table_17M)t
DB-小提琴
create table Table_17M(Date Date,Production int,LineName varchar(50),Buyer varchar(50),Style varchar(50));
insert into Table_17M values('2021-04-30',100,'A','Lev','1a');
insert into Table_17M values('2021-04-30',200,'B','Kont','2d');
insert into Table_17M values('2021-04-30',300,'C','ABB','4l');
insert into Table_17M values('2021-04-30',400,'1a');
insert into Table_17M values('2021-04-29',600,'BDA','3z');
查询:
DECLARE @cols AS NVARCHAR(MAX),@query AS NVARCHAR(MAX)
SET @cols = STUFF((SELECT distinct ',' + quotename([date])
FROM Table_17M
FOR XML PATH(''),TYPE
).value('.','NVARCHAR(MAX)'),1,'')
set @query = 'select LineName,' + @cols + ' from
(
select LineName,[date],concat(sum(production),'',max(buyer),string_agg(Style,'')) other_columns
from Table_17M
group by LineName,[date]
) x
pivot
(
max(other_columns)
for [date] in (' + @cols + ')
) p
group by LineName,' + @cols
execute( @query)
输出:
LineName | 2021-04-29 | 2021-04-30 |
---|---|---|
A | 600,BDA,3z | 500,Lev,1a,1a |
B | null | 200,Kont,2d |
C | null | 300,ABB,4l |
db
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。