2016-06-24 2 views
0

Ich muss meine Zeilen zu Spalten transponieren, aber ich kenne nicht die Anzahl der Zeilen in meiner Tabelle. Dieses Beispiel funktioniert für eine statische Anzahl von Zeilen. Ich habe einige dynamische SQL-Beispiele auf dieser Site gefunden, aber ich verstehe nicht genau, wie sie funktionieren, was ich brauche.Transponieren Sie Zeilen zu Spalten für Uknown Anzahl der Spalten

SELECT [9 payments], [Delay Tax return], [New Payment Schedule] 
 
FROM 
 
(SELECT RehabMetric, Reviews.ReviewID 
 
FROM RehabMetricsCalls INNER JOIN 
 
    RehabMetrics ON RehabMetricsCalls.RehabMetricID = RehabMetrics.RehabMetricID INNER JOIN 
 
    Reviews ON RehabMetricsCalls.ReviewID = Reviews.ReviewID) AS pivTemp 
 
PIVOT 
 
( COUNT(ReviewID) 
 
    FOR RehabMetric IN ([9 payments], [Delay Tax return], [New Payment Schedule]) 
 
) AS pivTable 
 

 
Table names: 
 

 
*RehabMetrics* 
 
RehabMetricID 
 
RehabMetric 
 

 
(Sample Data) 
 
2, Nine Payments 
 
7,Delay Tax Return 
 
12, Continue Payments 
 

 
*RehabMetricsCalls* 
 
RehabMetricID 
 
ReviewID 
 

 
*Reviews* 
 
ReviewID

Antwort

0

Wenn ich Ihre Frage richtig verstanden hat, dann müssen Sie diesen Teil Ihrer Abfrage

[9 payments], [Delay Tax return], [Delay Tax return] 

durch dynamisch etwas zu ersetzen.

Nehmen wir an, dass es eine Abfrage Spaltennamen wie zum Beispiel wiederkehr

select name from some_table_with_your_column_names 

, wo das Ergebnis in Ihrem Fall ist

name 
--------------------- 
[9 payments] 
[Delay Tax return] 
[Delay Tax return] 

der So, jetzt lassen Sie versuchen, Ihre Frage

zu beantworten
declare @columns nvarchar(max) = ''; 

select @columns = concat(@columns, iif(@columns <> '', '], ', ''), '[', name) 
from some_table_with_your_column_names 
where name is not null 
and name <> ''; 

if @columns <> '' begin 
    select @columns = concat(@columns, ']'); 

    declare @query nvarchar(max) = N'select ' + @columns + ' from (select RehabMetric, Reviews.ReviewID from RehabMetricsCalls inner join RehabMetrics ON RehabMetricsCalls.RehabMetricID = RehabMetrics.RehabMetricID inner join Reviews ON RehabMetricsCalls.ReviewID = Reviews.ReviewID) AS pivTemp pivot( count(ReviewID) for RehabMetric in (' + @columns + ')) AS pivTable'; 

    execute sp_executesql @query; 
end else begin 
    -- do something else here if your column list is empty 
end