2016-08-23 1 views
0

Das ist meine erste Frage hier und bitte entschuldigen Sie, wenn meine Frage verkabelt aussieht. Ich bin völlig neu in der Programmierung und SQL, obwohl ich einige Kenntnisse in ms Access-Datenbank habe.Kann ich eine Spalte mit Kopfzeilennamen entsprechend den Werten in einer anderen Tabelle erstellen?

Ich habe zwei Tabellen OrdersTabel und OrderedItems erstellt. Dann möchte ich eine andere Tabelle erstellen OrderFullDetails wie im Screenshot hier:

table Picture

I OrderFullDetails Tabelle erstellen möchten wie folgt.

  1. Enthält in Item Spalt in OrderedItem Tabelle sollten durch seinen Namen separate Spalte in OrderFullDetails Tabelle erstellen.

  2. Wenn eine Spalte existiert bereits in Tabelle OrderFullDetails gleich OrderedItem Elementnamen in Tabelle nur der Qty Wert sollte auf die passenden Säule gemäß OrderNo eingegeben werden. Und wenn kein Spaltenabgleich vorhanden ist, sollte eine neue Spalte erstellt werden.

Ihre Hilfe wird Millionen wert für mich sein.

Danke

+4

Sie suchen nach einem PIVOT() es scheint. Probieren Sie es aus. Es gibt viele Beispiele zu Stack Overflow und dem Netz. Insbesondere möchten Sie wahrscheinlich dynamisches SQL verwenden, wenn mehr Elemente vorhanden sind als in Ihrem Beispiel. Hier ist eine großartige Referenz. http://sqlhints.com/2014/03/18/dynamic-pivot-in-sql-server/ – scsimon

+0

@scsimon, Vielen Dank für Sie schnelle Antwort, ich werde durchgehen, was Sie mir vorgeschlagen und bekommen zu backen Sie. Danke noch einmal. –

+0

Keine Sorge. Achten Sie darauf, Ihren Code zu posten, wenn Sie es versuchen, aber Straßenblockaden/-fehler auftreten. – scsimon

Antwort

2

Zuerst willkommen zu Stack Overflow. Normalerweise wird von Ihnen erwartet, dass Sie zeigen, wie Sie versucht haben, das Problem selbst zu lösen. Außerdem mögen wir Bilder nicht und bevorzugen es, einige Beispieldaten in einem Format zu erhalten, das uns das Kopieren erleichtert. Bitte beachten Sie, dass SO kein Kodierungsdienst ist. Weil es dein erstes Mal ist, werde ich freundlich sein.

Es widerspricht den normalen Regeln des relationalen Datenbankentwurfs, eine dritte Tabelle zu erstellen, die Daten enthält, die bereits in anderen Tabellen gespeichert sind. Sie sollten eine gespeicherte Prozedur erstellen, um die Datensätze aus beiden Tabellen in einem gewünschten Format abzurufen. Wie scsimon richtig sagt, braucht man einen PIVOT und ein dynamisches sql in diesem Verfahren.

Als Beispiel gebe ich folgendes:

CREATE PROCEDURE OrderExample 
AS 

CREATE TABLE #OrdersTable(
OrderNo int, 
OrderDate date, 
CustomerID int, 
TotalItems int, 
TotalAmount decimal(10,2) 
) 
INSERT INTO #OrdersTable VALUES(101, '2016-8-11', 354, 3, 30) 
INSERT INTO #OrdersTable VALUES(102, '2016-8-12', 221, 2, 20) 
INSERT INTO #OrdersTable VALUES(103, '2016-8-13', 67, 1, 20) 
INSERT INTO #OrdersTable VALUES(104, '2016-8-14', 8965, 3, 40) 

CREATE table #OrderedItems (
OrderNo int, 
OrderItem varchar(10), 
OrderQty int 
) 
INSERT INTO #OrderedItems VALUES(101, 'T-Shirt', 2) 
INSERT INTO #OrderedItems VALUES(101, 'Bedsheet', 1) 
INSERT INTO #OrderedItems VALUES(102, 'Pants', 2) 
INSERT INTO #OrderedItems VALUES(103, 'Quilt', 1) 
INSERT INTO #OrderedItems VALUES(104, 'T-Shirt', 2) 
INSERT INTO #OrderedItems VALUES(104, 'Pants', 1) 

DECLARE @itemNames varchar(max) = 
(SELECT STUFF((SELECT DISTINCT ',' + QUOTENAME(OrderItem) 
FROM #OrderedItems FOR XML PATH('')), 1, 1, '') AS ColList) 


DECLARE @sql varchar(max) = 'SELECT OrderNo, OrderDate, CustomerID, 
TotalItems, TotalAmount,' + @itemNames + ' FROM 
(SELECT o.OrderNo, o.OrderDate, o.CustomerID, o.TotalItems, o.TotalAmount, 
i.OrderItem, i.OrderQty 
FROM #OrdersTable o 
INNER JOIN #OrderedItems i ON i.OrderNo = o.OrderNo) SubQ 
PIVOT(SUM(OrderQty) FOR OrderItem IN (' + @itemNames + ')) as pvt' 

exec (@sql) 

DROP TABLE #OrdersTable 
DROP TABLE #OrderedItems 

dies ausführen zu können, geben Sie einfach: exec OrderExample

Das Ergebnis

OrderNo OrderDate CustomerID TotalItems TotalAmount Bedsheet Pants Quilt T-Shirt 
101  2016-08-11 354   3   30.00  1   NULL NULL 2 
102  2016-08-12 221   2   20.00  NULL  2  NULL NULL 
103  2016-08-13 67   1   20.00  NULL  NULL  1 NULL 
104  2016-08-14 8965  3   40.00  NULL  1  NULL 2 

Hinweis sein, dass in der fertigen Version Sie werden die Zeilen, die die temporären Tabellen erstellen, nicht benötigen, Daten einfügen und sie schließlich wieder löschen. Stattdessen müssen Sie die #OrdersTable und #OrderedItems durch die Namen Ihrer korrekten Tabellen (und natürlich der korrekten Feldnamen) ersetzen. Ich habe sie nur aufgenommen, so dass das Beispiel als Stand-alone ausgeführt wird.

+1

@Chris ich benutze dynamische sql? Die STUFF-Funktion wird verwendet, um alle Elementnamen über SELECT DISTINCT für die OrderedItem-Tabelle abzurufen. Die Werte sind nicht fest codiert. Also verstehe ich nicht, warum das nicht funktioniert, wenn mehr Gegenstände hinzugefügt werden. Wenn ich etwas falsch gemacht habe, können Sie mich bitte korrigieren. –

+0

Oh, schießen ... Ich habe Ihre Antwort falsch gelesen (sah die Beispieldaten, die Sie eingefügt haben und eine zu schnelle Annahme, dass es die Spalten definiert). Bitte ignoriere meinen Kommentar. Ich habe deine Antwort erneuert. –

+0

@Chris Steele Dank es war spät am Abend für mich, und ich dachte für einen Moment wurde ich verrückt. –

Verwandte Themen