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.
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
@scsimon, Vielen Dank für Sie schnelle Antwort, ich werde durchgehen, was Sie mir vorgeschlagen und bekommen zu backen Sie. Danke noch einmal. –
Keine Sorge. Achten Sie darauf, Ihren Code zu posten, wenn Sie es versuchen, aber Straßenblockaden/-fehler auftreten. – scsimon