#sql #sql-server #pivot-table #unpivot
#sql #sql-сервер #сводная таблица #открепить
Вопрос:
У меня есть таблица sql с именем BasketTable, в которой есть такие данные, как
Assists Rebounds Steals Blocks Fouls TeamId
10 32 8 6 11 13
18 36 8 6 9 9
Я хочу, чтобы вывод был таким
StatsName Team1 Team2
Assists 10 18
Rebounds 32 36
Steals 8 8
Blocks 6 6
Fouls 11 9
Если в примере есть 3 строки, то в выводе будет добавлен третий столбец данных команды
Я пытаюсь выполнить этот запрос для этого
select StatsName, HomeTeam from
(
select Assists, DefensiveRebounds as Rebounds, Steals, Blocks, PersonalFouls as Fouls
from CombinationStatistics cs
where GameId = 1082960
) x
unpivot (
HomeTeam for StatsName IN (Assists, Rebounds, Steals, Blocks, Fouls)
) p
Приведенный выше запрос дает мне такой вывод,
StatsName HomeTeam
Assists 10
Rebounds 32
Steals 8
Blocks 6
Fouls 11
Assists 18
Rebounds 36
Steals 8
Blocks 6
Fouls 9
Я знаю, что это неправильно, я хочу еще один столбец для второй команды, прямо сейчас он находится в одном столбце. Как дифференцировать данные по TeamID?
Комментарии:
1. Итак … в чем ваш вопрос / проблема? Вы читали docs.microsoft.com/en-us/sql/t-sql/queries /… пока?
2. Здесь вам потребуется как отменить, так и выполнить поворот. Если у вас неопределенное количество команд, это будет настоящий «грязный» динамический SQL. Я бы настоятельно рекомендовал, чтобы это не делалось в SQL, если вы не знакомы с ним. Похоже, что-то нужно для вашего уровня представления; например, матрица в SSRS или сводная таблица в Microsoft Excel.
3. Вам нужно добавить
TeamID
. Вот и все!4. Я добавил TeamID, но он не работает @MaciejLos
5. Это еще не «все» @MaciejLos . Затем OP необходимо будет преобразовать свои неотправленные данные, и даже тогда он будет обрабатывать только 2 команды для 2 .
Ответ №1:
Это будет работать для определенного количества команд, в данном случае 2. Однако он не вернет больше столбцов, если у вас больше команд. Это потому, что единственный способ сделать это — использовать динамический SQL, и, честно говоря, открепление, а затем динамический поворот — это беспорядочно, а не то, что вы должны делать в SQL. Это задание для уровня представления.
WITH RNs AS(
SELECT Assists,
Rebounds,
Steals,
Blocks,
Fouls,
TeamId,
ROW_NUMBER() OVER (ORDER BY TeamID DESC) AS RN
FROM dbo.YourTable),
Unpvt AS(
SELECT RN.RN,
V.StatName,
V.StatNumber
FROM RNs RN
CROSS APPLY (VALUES('Assists',RN.Assists),
('Rebounds',RN.Rebounds),
('Steals',RN.Steals),
('Fouls',RN.Fouls))V(StatName,StatNumber))
SELECT U.StatName,
MAX(CASE U.RN WHEN 1 THEN StatNumber END) AS Team1,
MAX(CASE U.RN WHEN 2 THEN StatNumber END) AS Team2
FROM Unpvt U;
Конечно, если вы не понимаете вышесказанного, вам не следует отказываться от динамического подхода, поскольку у вас не будет надежды на его поддержку; и это вам нужно будет поддерживать, а не сообществу по Stack Overflow.
Ответ №2:
Как упоминал @Larnu, вам нужно отключить данные и снова преобразовать их. См.:
SELECT StatsName, [9], [13]
FROM
(
SELECT TeamId, StatsName, HomeTeam
FROM
(
SELECT 10 Assists, 32 Rebounds, 8 Steals, 6 Blocks, 11 Fouls, 13 TeamId
UNION ALL
SELECT 18 Assists, 36 Rebounds, 8 Steals, 6 Blocks, 9 Fouls, 9 TeamId
) pvt
unpivot
(
HomeTeam for StatsName IN (Assists, Rebounds, Steals, Blocks, Fouls)
) unpvt
) src
pivot(SUM(HomeTeam) for TeamId IN([9], [13])) final