2017-11-07 7 views
1

Ich muss meine Zeilenwerte in Zeilen und Spalten nebeneinander dynamisch anzeigen und 2 Werte durch Komma getrennt in einer Zelle verketten. Siehe Beispiel unten. Irgendwelche Hilfe wird geschätzt.PIVOT Zeilenwerte in Zeilen und Spalten nebeneinander und verketten 2 Werte durch Komma getrennt in einer Zelle

Table1 

Toys CostPrice SellingPrice 
---- --------- ------------- 
A  10.55  12.60 
B  7.60  8.90 
C  8.90  10.50 
D  11.50  13.40 
E  17.50  20.30 
F  2.57  3.50 

Ich muss in diesem Format angezeigt werden. Vielen Dank.

Toys A    B   C   D   E   F 
---- -----   -------  ----   ---   ----  --- 
A  10.55,12.60 
B     7.60,8.90 
C        8.90,10.50 
D           11.50,13.40 
E              17.50,20.30 
F                 2.57,3.50 
+1

Nicht die einfachste in SQL ... SQL ist Ihre Datenbeschaffungsebene, nicht so sehr Ihre Anzeigeebene. Einfachste Möglichkeit zu tun das ist Exportieren Sie Ihre Ergebnisse in Excel und lassen Sie sie drehen. Wenn Sie eine reine SQL-Antwort wünschen, kommt diese Frage ungefähr 10 Mal täglich hier auf ... Suchen Sie die Website nach einer Antwort. – Twelfth

+0

Welche dbms ???????? – Eric

+0

Microsoft SQL 2012 – Etex

Antwort

0

In Ordnung, noch einmal dann! Zuerst werden Sie feststellen, dass ich eine Temp-Tabelle anstelle einer Tabellenvariablen für das Beispiel erstellt habe, für die die Variable @tablecolumns erforderlich ist. Trifft nicht wirklich zu, aber es war eine Änderung, auf die ich geachtet habe, wenn Sie den Code kopieren/einfügen, um damit zu spielen.

@tablecolumns ist das dynamische Stück, das Sie benötigen, es erstellt einen Wert, der wie folgt aussieht: "[A], [B], [C] ...." für die Pivot-Tabelle.

Jetzt müssen Sie die Abfrage als Dynamic SQL ausführen, um Ihre @ Tablescolumns-Variable korrekt zu werfen. (Je nachdem, wie hoch die tatsächliche Abfrage bekommt können Sie entscheiden, die Abfrage selbst in einer Ansicht zu setzen und wählen Sie/verketten, was Sie aus der Sicht brauchen stattdessen finde ich dynamische SQL ein wenig seltsam so manchmal das ist einfacher)

create table #toystab (Toys nvarchar(1), Cost decimal (5,2), Sell decimal (5,2)) 

insert into #toystab values ('A', 5.50, 6.60) 
insert into #toystab values ('B', 6.50, 7.60) 
insert into #toystab values ('C', 7.50, 8.60) 
insert into #toystab values ('D', 8.50, 9.60) 
insert into #toystab values ('E', 11.50, 12.60) 
insert into #toystab values ('F', 13.50, 14.60) 

DECLARE @tablecolumns nvarchar(max) 
select @tablecolumns = (COALESCE(@tablecolumns +',', '') 
         + '[' + convert(nvarchar(10), #Toystab.Toys) +']') 
from #toystab 


declare @Query nvarchar(max) 
set @Query = ' 
select * 
from (
select Toys Toy1, Toys ToyName, 
CONCAT(cast(Cost as varchar(10)), '','', cast(Sell as varchar(10))) as [ConcatenatedPrice] 
from #toystab) Toyz 

pivot 
(
MAX(ConcatenatedPrice) 
for Toy1 in (' + @tablecolumns+ ') 
) 
as [Pivot] 
' 
exec(@Query) 

drop table #toystab 

Beachten Sie ein paar Dinge. Erstens, dass ich die Toys-Spalte zweimal auswähle, einmal um zu drehen und einmal um eine Spalte zu sein. Zweitens, in der CONCAT-Anweisung ist das Trennzeichen '', '' kein Zitat (') es sind zwei Apostrophe (' '). Wenn Sie ein Zitat machen "," erhalten Sie einen ungültigen Spaltenfehler eine Erinnerung, stellen Sie sicher, Exec (@Query) enthält die Parens

+0

Konnte mit einigen ISNULLs aufgeräumt werden, um die NULL Antworten leer zu machen. – BWoods

+0

Danke dir Bwoods. Ihr Format ist, was ich wollte, aber ich muss die Toy-Namen dynamisch in Spalten über und Reihen von oben nach unten machen, weil ich nicht weiß, wie viele Toy-Namen ich jedes Mal habe. Es kann von A bis F im ersten Monat und im nächsten Monat von A bis Z sein. Auch die Namen der Spielzeuge ändern sich möglicherweise nicht immer in Alphabet. Ich habe A bis F benutzt, nur zum Beispiel sind die echten Namen unterschiedlich. Lass mich wissen, ob es einen Weg gibt, es dynamisch zu machen. Vielen Dank. – Etex

+0

Da du die Frage aktualisiert hast, habe ich kürzlich etwas Ähnliches gemacht. Ich werde meine Antwort aktualisieren, wenn ich eine Chance bekomme. – BWoods

0

Vielen Dank Sie Woods.Ihr Format ist, was ich wollte, aber ich muss die Toy-Namen dynamisch in Spalten über und Reihen von oben nach unten, weil ich nicht weiß, wie Viele Toy Namen habe ich jedes Mal, es kann von A bis F im ersten Monat und nächsten Monat von A bis Z sein. Auch die Namen der Spielzeuge ändern sich nicht immer in Alphabet. Ich habe zum Beispiel nur A bis F benutzt Die tatsächlichen Namen sind anders, lassen Sie mich wissen, wenn es eine Möglichkeit gibt, es dynamisch zu tun. Danke.

Verwandte Themen