gpt4 book ai didi

sql - 在 SQL Server 中动态地将多行合并为多列

转载 作者:行者123 更新时间:2023-12-02 07:16:19 25 4
gpt4 key购买 nike

我有一个大型数据库表,需要使用 Microsoft SQL Server 动态执行以下操作。

从这样的结果:

 badge   |   name   |   Job   |   KDA   |   Match 
- - - - - - - - - - - - - - - -
T996 | Darrien | AP | 3.0 | 20
T996 | Darrien | ADC | 2.8 | 16
T996 | Darrien | TOP | 5.0 | 120

使用 SQL 得到这样的结果:

badge   |   name   |  AP_KDA | AP_Match | ADC_KDA | ADC_Match | TOP_KDA | TOP_Match 
- - - - - - - - -
T996 | Darrien | 3.0 | 20 | 2.8 | 16 | 5.0 | 120

即使有 30 行,也会合并为 60 列的单行。

我目前可以通过硬编码来完成此操作(请参见下面的示例),但不能动态完成。

Select badge,name,
(
SELECT max(KDA)
FROM table
WHERE (h.badge = badge) AND (h.name = name)
AND (Job = 'AP')
) AP_KDA,
(
SELECT max(Match)
FROM table
WHERE (h.badge = badge) AND (h.name = name)
AND (Job = 'AP')
) AP_Match,
(
SELECT max(KDA)
FROM table
WHERE (h.badge = badge) AND (h.name = name)
AND (Job = 'ADC')
) ADC_KDA,
(
SELECT max(Match)
FROM table
WHERE (h.badge = badge) AND (h.name = name)
AND (Job = 'ADC')
) ADC_Match,
(
SELECT max(KDA)
FROM table
WHERE (h.badge = badge) AND (h.name = name)
AND (Job = 'TOP')
) TOP_KDA,
(
SELECT max(Match)
FROM table
WHERE (h.badge = badge) AND (h.name = name)
AND (Job = 'TOP')
) TOP_Match
from table h

我需要一个 MSSQL 语句,该语句允许我将多行合并为一行。第 3 列(Job)内容将与第 4 列和第 5 列标题(KDAMatch)合并并成为一个新列。

因此,如果 Job 有 6 个不同的值(例如 Job1Job6),那么结果将有 12 列,例如:Job1_KDAJob1_MatchJob2_KDAJob2_Match等,按徽章和名称分组。

我需要一个可以循环第 3 列数据的语句,这样我就不需要硬编码(对每个可能的 Job 值重复查询)或使用临时表。

最佳答案

我会使用动态 sql 来完成此操作,但这是 ( http://sqlfiddle.com/#!6/a63a6/1/0 ) PIVOT 解决方案:

SELECT badge, name, [AP_KDa], [AP_Match], [ADC_KDA],[ADC_Match],[TOP_KDA],[TOP_Match] FROM
(
SELECT badge, name, col, val FROM(
SELECT *, Job+'_KDA' as Col, KDA as Val FROM @T
UNION
SELECT *, Job+'_Match' as Col,Match as Val FROM @T
) t
) tt
PIVOT ( max(val) for Col in ([AP_KDa], [AP_Match], [ADC_KDA],[ADC_Match],[TOP_KDA],[TOP_Match]) ) AS pvt

奖励:这就是如何将 PIVOT 与动态 SQL ( http://sqlfiddle.com/#!6/a63a6/7/0 ) 结合起来,同样,我更愿意在没有 PIVOT 的情况下做得更简单,但这对我来说只是很好的锻炼:

SELECT badge, name, cast(Job+'_KDA' as nvarchar(128)) as Col, KDA as Val INTO #Temp1 FROM Temp 
INSERT INTO #Temp1 SELECT badge, name, Job+'_Match' as Col, Match as Val FROM Temp

DECLARE @columns nvarchar(max)
SELECT @columns = COALESCE(@columns + ', ', '') + Col FROM #Temp1 GROUP BY Col

DECLARE @sql nvarchar(max) = 'SELECT badge, name, '+@columns+' FROM #Temp1 PIVOT ( max(val) for Col in ('+@columns+') ) AS pvt'
exec (@sql)

DROP TABLE #Temp1

关于sql - 在 SQL Server 中动态地将多行合并为多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21692871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com