У меня есть извлечение данных из SQL Server около 5000 строк, как показано ниже. И я копирую-вставляю его в файл Excel.
Но я хочу преобразовать данные в этот формат:
Должен ли я выполнить эту работу на первом этапе (на стороне SQL Server) или в Excel? Какое решение легче исследовать и изучить?
Также я был бы рад, если бы вы могли привести пример.
Спасибо.
не уверен, что это может помочь, но может заглянуть в Pivot. docs.microsoft.com/en-us/sql/t-sql/queries/…
Вы смотрели на поворот столбца ID
перед копированием в Excel?
Если у вас есть известное или максимальное количество столбцов, вы можете использовать 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 В вашем вопросе отсутствуют некоторые важные детали. Посмотреть обновление
Сторона Excel кажется более подходящей, потому что, похоже, у нее нет никакой логики, кроме вырезания и вставки вручную.