我需要使用 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列的标头(KDA
和Match
)组合,并成为一个新列。
所以,如果存在6个不同的 Job
值(比如 Job1
到 Job6
),则结果将有12列,例如: Job1_KDA
, Job1_Match
, Job2_KDA
, Job2_Match
等,按徽章和姓名分组。
我需要一条语句,可以循环遍历第3列的数据,这样我就不需要硬编码(针对每个可能的 Job
值重复查询)或使用临时表。
[sql-server] pivot
可以找到许多关于如何做你所问的事情的例子。例如,这个问题执行了类似的操作(尽管它将六行转换为三行)。 - Ken White