Der einzige Weg, an den ich denken kann, ist sehr umständlich und wahrscheinlich extrem langsam: Verwenden einer Tally-Tabelle (Ich habe eine rekursive Cte für diese Antwort erzeugt, aber das ist auch kein sehr guter Weg tun Sie das ...) und mehrere abgeleitete Tabellen, die mit dieser Tabelle verknüpft sind, konnte ich etwas entwickeln, das die gewünschte Ausgabe erzeugt.
Allerdings, wie ich oben geschrieben habe - es ist sehr umständlich und wahrscheinlich extrem langsam (Ich habe nur auf eine Tabelle mit 5 Spalten und 6 Zeilen getestet, so habe ich keine Ahnung über die Ausführungsgeschwindigkeit).
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)
Dynamische Version:
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)
aktualisieren
auf einen Tisch Getestet mit 22 Spalten und 47.000 Zeilen, nahm mein Vorschlag 46 Sekunden, wenn ein proper tally table. auf SQL Server 2014 verwenden Ich war überrascht - ich dachte es würde mindestens 2-3 Minuten dauern.
Unterscheiden sich die Datentypen Ihrer Spalten nicht? – Heinzi
Beispieldaten und gewünschte Ergebnisse anzeigen. –
Ich kann mir kein Szenario vorstellen, wo das nützlich wäre. Wie würdest du sie trotzdem kombinieren? Ich schätze mal, jede Spalte hat eine andere Anzahl an eindeutigen Werten .... –