Единственный способ, о котором я могу думать, очень громоздкий и, возможно, очень медленный: Использование таблицы Tally (я создал один, используя рекурсивный cte для этого ответа, но это также не очень хороший способ сделайте это ...), и несколько полученных таблиц слева присоединились к этой таблице таблиц, я смог придумать что-то, что будет генерировать желаемый результат.
Однако, как я писал сверху, это очень громоздко и, вероятно, очень медленно (я тестировал только на столе с 5 столбцами и 6 строками, поэтому я понятия не имею о скорости выполнения).
DECLARE @Count int
select @Count = COUNT(1)
FROM YourTable
;with tally as (
select 1 as n
union all
select n + 1
from tally
where n < @Count
)
SELECT Column1, Column2, Column3, Column4, Column5
FROM tally
LEFT JOIN
(
SELECT Column1, ROW_NUMBER() OVER (ORDER BY Column1) rn
FROM
(
SELECT DISTINCT Column1
FROM YourTable
) t1
) d1 ON(n = d1.rn)
LEFT JOIN
(
SELECT Column2, ROW_NUMBER() OVER (ORDER BY Column2) rn
FROM
(
SELECT DISTINCT Column2
FROM YourTable
) t1
) d2 ON(n = d2.rn)
LEFT JOIN
(
SELECT Column3, ROW_NUMBER() OVER (ORDER BY Column3) rn
FROM
(
SELECT DISTINCT Column3
FROM YourTable
) t1
) d3 ON(n = d3.rn)
LEFT JOIN
(
SELECT Column4, ROW_NUMBER() OVER (ORDER BY Column4) rn
FROM
(
SELECT DISTINCT Column4
FROM YourTable
) t1
) d4 ON(n = d4.rn)
LEFT JOIN
(
SELECT Column5, ROW_NUMBER() OVER (ORDER BY Column5) rn
FROM
(
SELECT DISTINCT Column5
FROM YourTable
) t1
) d5 ON(n = d5.rn)
Динамическая версия:
DECLARE @TableName sysname = 'YourTableName'
DECLARE @Sql nvarchar(max) =
'
DECLARE @Count int
select @Count = COUNT(1)
FROM '+ @TableName +'
;with tally as (
select 1 as n
union all
select n + 1
from tally
where n < @Count
)
SELECT '
SELECT @Sql = @Sql + Column_Name +','
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TableName
SELECT @Sql = LEFT(@Sql, LEN(@Sql) - 1) + ' FROM tally t'
SELECT @Sql = @Sql + ' LEFT JOIN (SELECT '+ Column_Name +', ROW_NUMBER() OVER (ORDER BY ' + Column_Name +') rn
FROM
(
SELECT DISTINCT '+ Column_Name +' FROM '+ @TableName +') t
) c_'+ Column_Name + ' ON(n = c_'+ Column_Name + '.rn)'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TableName
EXEC(@Sql)
Update
Испытано на столе с 22 колоннами и 47000 строк, мое предложение принял 46 секунд при использовании proper tally table. на Sql сервере 2014 Я был удивлен - я думал, что это займет не менее 2-3 минут.
Не будут отличаться типы данных ваших столбцов? – Heinzi
Показать пример данных и желаемых результатов. –
Я не могу представить ни одного сценария, где это было бы полезно. Как бы вы все равно их объединили? Я предполагаю, что каждый столбец имеет различное количество различных значений .... –