Вертикальные данные Excel или SQL в горизонтальные

У меня есть извлечение данных из SQL Server около 5000 строк, как показано ниже. И я копирую-вставляю его в файл Excel.

Вертикальные данные Excel или SQL в горизонтальные

Но я хочу преобразовать данные в этот формат:

Вертикальные данные Excel или SQL в горизонтальные

Должен ли я выполнить эту работу на первом этапе (на стороне SQL Server) или в Excel? Какое решение легче исследовать и изучить?

Также я был бы рад, если бы вы могли привести пример.

Спасибо.

Сторона Excel кажется более подходящей, потому что, похоже, у нее нет никакой логики, кроме вырезания и вставки вручную.

Cetin Basoz 19.03.2022 16:22

не уверен, что это может помочь, но может заглянуть в Pivot. docs.microsoft.com/en-us/sql/t-sql/queries/…

AJP 19.03.2022 16:59

Вы смотрели на поворот столбца ID перед копированием в Excel?

Peter Smith 19.03.2022 18:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если у вас есть известное или максимальное количество столбцов, вы можете использовать PIVOT совместно с row_number().

Если максимум неизвестен, вам понадобится динамический SQL

Пример или дбфиддл

Select *
 From  (
        Select A.ID
              ,B.* 
         from (Select *
                     ,Grp = row_number() over (partition by ID order by ID) 
                From  YourTable
              ) A
         Cross Apply ( values (concat('Column1-',Grp),Column1)
                             ,(concat('Column2-',Grp),Column2)
                             ,(concat('Column3-',Grp),Column3)
                             ,(concat('Column4-',Grp),Column4)
                     ) B(Col,Val)
       ) src
 Pivot (max(Val) for Col in ( [Column1-1]
                             ,[Column2-1]
                             ,[Column3-1]
                             ,[Column4-1]
                             ,[Column1-2]
                             ,[Column2-2]
                             ,[Column3-2]
                             ,[Column4-2]
                             ,[Column1-3]
                             ,[Column2-3]
                             ,[Column3-3]
                             ,[Column4-3]
                            )  ) pvt 

Полученные результаты

РЕДАКТИРОВАТЬ - Обновление для динамического SQL и типа переменных данных

Declare @SQL varchar(max) = (
Select string_agg(concat('[',Col,N,']'),',') within group (order by N,Col)
 From (values ('Column1-')
             ,('Column2-')
             ,('Column3-')
             ,('Column4-')
      ) A(Col)
Cross Join ( Select distinct N=row_number() over (partition by ID order by ID) From  YourTable ) B
)

Set @SQL = '
Select *
 From  (Select A.ID
              ,B.* 
         from (Select *
                     ,Grp = row_number() over (partition by ID order by ID) 
                From  YourTable
              ) A
         Cross Apply ( Select col = concat([Key],''-'',Grp)
                             ,Val = value
                        From  OpenJson((Select A.* For JSON Path,Without_Array_Wrapper )) 
                     ) B
       ) src
 Pivot (max(Val) for Col in ( '+@SQL+' )  ) pvt '

 Exec(@SQL)

Спасибо за ответ. Я знаю количество столбцов в каждой группе, но не знаю максимальное количество групп. Поэтому мне нужно изменить этот поворот на динамический подсчет групп N и решить проблемы с типами данных. Некоторые столбцы в некоторых дата-время и т.д.

Lacrymae 24.03.2022 09:19

@Lacrymae В вашем вопросе отсутствуют некоторые важные детали. Посмотреть обновление

John Cappelletti 24.03.2022 17:06

Другие вопросы по теме