I have a large database table on which I need to perform the action below dynamically using Microsoft SQL Server.
From a result like this:
badge | name | Job | KDA | Match
- - - - - - - - - - - - - - - -
T996 | Darrien | AP | 3.0 | 20
T996 | Darrien | ADC | 2.8 | 16
T996 | Darrien | TOP | 5.0 | 120
To a result like this using 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
Even if there are 30 rows, it also will combine into a single row with 60 columns.
I am currently able to do it by hard coding (see the example below), but not dynamically.
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
I need an MSSQL statement that allows me to combine multiple rows into one row. The column 3 (Job
) content will combine with the column 4 and 5 headers (KDA
and Match
) and become a new column.
So, if there are 6 distinct values for Job
(say Job1
through Job6
), then the result will have 12 columns, e.g.: Job1_KDA
, Job1_Match
, Job2_KDA
, Job2_Match
, etc., grouped by badge and name.
I need a statement that that can loop through the column 3 data so I don't need to hardcode (repeat the query for each possible Job
value) or use a temp table.
[sql-server] pivot
for multiple examples of doing exactly what you're asking. For instance, this question performs a similar type operation (although it converts six rows into three). – Ikey