首先歡迎來到堆棧溢出。通常在問一個問題時,你需要展示你是如何嘗試自己解決問題的。此外,我們不喜歡圖片,並且傾向於給予一些示例數據,以便於我們複製的格式。請注意,SO不是一個編碼服務。但是,因爲這是你第一次,我會友好的。
它違背了關係數據庫設計的常規規則,即構建第三個表來保存已存在於其他表中的數據。你應該做的是創建一個存儲過程,以所需的格式從兩個表中檢索記錄。正如scsimon正確地說你在這個過程中需要一個PIVOT和一些動態的sql。
舉例來說我給出如下:
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
要運行它,只需鍵入:EXEC OrderExample
其結果將是
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
注意,在你的漢化版您將不需要創建臨時表的行,插入數據,然後再次刪除它們。相反,您必須將#OrdersTable和#OrderedItems替換爲正確表格的名稱(當然還有正確的字段名稱)。我只包含它們,以便該示例作爲獨立運行。
您正在尋找一個PIVOT()。嘗試一下。有很多關於堆棧溢出和網絡的例子。具體來說,如果有比您的示例中更多的項目,您可能會想要使用動態SQL。這是一個很好的參考。 http://sqlhints.com/2014/03/18/dynamic-pivot-in-sql-server/ – scsimon
@scsimon,非常感謝你對我的迴應,我會經歷你的建議,並且會得到烤您。再次感謝。 –
不用擔心。如果您嘗試過,請務必發佈您的代碼,但遇到路障/錯誤。 – scsimon