2016-08-23 87 views
0

這是我的第一個問題,請原諒,如果我的問題看起來有線。儘管我對ms訪問數據庫有一些瞭解,但對編程和SQL來說,這是全新的。我可以根據另一個表中的值創建標題名稱列嗎?

我已經創建了兩個表OrdersTabelOrderedItems。然後我想創建另一個表OrderFullDetails如這裏的截圖:

table Picture

我想創建OrderFullDetails表如下。

  1. 包含在OrderedItemItem列應在OrderFullDetails表以其名字創建單獨的列。

  2. 如果列已在OrderFullDetails表等於項目名稱OrderedItem表存在,只有Qty值應根據OrderNo輸入到匹配列。如果沒有列匹配,它應該創建一個新列。

你的幫助將會對我有價值。

謝謝

+4

您正在尋找一個PIVOT()。嘗試一下。有很多關於堆棧溢出和網絡的例子。具體來說,如果有比您的示例中更多的項目,您可能會想要使用動態SQL。這是一個很好的參考。 http://sqlhints.com/2014/03/18/dynamic-pivot-in-sql-server/ – scsimon

+0

@scsimon,非常感謝你對我的迴應,我會經歷你的建議,並且會得到烤您。再次感謝。 –

+0

不用擔心。如果您嘗試過,請務必發佈您的代碼,但遇到路障/錯誤。 – scsimon

回答

2

首先歡迎來到堆棧溢出。通常在問一個問題時,你需要展示你是如何嘗試自己解決問題的。此外,我們不喜歡圖片,並且傾向於給予一些示例數據,以便於我們複製的格式。請注意,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替換爲正確表格的名稱(當然還有正確的字段名稱)。我只包含它們,以便該示例作爲獨立運行。

+1

@Chris我正在使用動態sql嗎? STUFF函數用於通過OrderedItem表上的SELECT DISTINCT獲取所有項目名稱。這些值不是硬編碼的。所以我不明白爲什麼這將無法正常工作,如果添加更多的項目。如果我做錯了什麼,請你糾正我。 – 2016-08-24 01:25:30

+0

哦,開槍......我誤解了你的答案(看到你插入的樣本數據,並做出了一個太快的假設,即它正在定義列)。請忽略我的評論。我贊成你的答案。 –

+0

@Chris Steele謝謝,晚上對我來說已經很晚了,我想了一會兒我發瘋了。 – 2016-08-24 15:20:00

相關問題