【发布时间】:2014-03-08 17:00:50
【问题描述】:
我有一个大型数据库表,我需要使用 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)合并成为一个新列。
所以,如果Job 有 6 个不同的值(比如 Job1 到 Job6),那么结果将有 12 列,例如:Job1_KDA、Job1_Match、Job2_KDA、@987654334 @ 等,按徽章和名称分组。
我需要一个可以循环遍历第 3 列数据的语句,因此我不需要硬编码(对每个可能的 Job 值重复查询)或使用临时表。
【问题讨论】:
-
大家好,我要问的问题是一个 mssql 语句,它允许我将多行合并为一行。第 3 列内容将与第 4,5 列标题合并,成为一个新列。因此,如果第 3 列中有 6 个不同的数据,那么它将产生 12 列。例如:Job1_KDA、Job1_Match、Job2_KDA、Job2_Match、Job3_KDA、Job3_Match、Job4_KDA、Job4_Match
-
这里有很多相关的问题。搜索
[sql-server] pivot以获取多个完全按照您的要求进行操作的示例。例如,this question 执行类似的类型操作(尽管它将六行转换为三行)。
标签: sql sql-server rows multiple-columns