Необходимо ПРЕОБРАЗОВАТЬ данные из таблицы в SQL

#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
 

db_fiddle