2016-04-21 37 views
2

我已經編寫了一個SQL查詢來計算我們每個倉庫中的庫存總量,如下所示。如何彙總說明欄?

SELECT 
    InventoryItem.ItemName as 'Part Number', 
    InventoryItemDescription.ItemDescription as 'Description', 
    InventoryStockTotal.UnitsInStock as 'In Stock', 
    InventoryStockTotal.WarehouseCode AS 'Warehouse', 
    InventoryItem.Status, 
    InventoryItem.AverageCost AS 'Average Cost', 
    (InventoryItem.AverageCost * UnitsInStock) AS 'Stock Value' 


FROM dbo.InventoryItemDescription 
INNER JOIN dbo.InventoryItem 
    ON InventoryItemDescription.ItemCode = InventoryItem.ItemCode 
INNER JOIN dbo.InventoryStockTotal 
    ON InventoryStockTotal.ItemCode = InventoryItem.ItemCode 


這給了我這樣的


╔═════════════╦═════════════╦══════════╦═══════════════════╦════════╦══════════════╦═════════════╗ 
║ Part Number ║ Description ║ In Stock ║  Warehouse  ║ Status ║ Average Cost ║ Stock Value ║ 
╠═════════════╬═════════════╬══════════╬═══════════════════╬════════╬══════════════╬═════════════╣ 
║   555 ║ FILTER  ║  0 ║ BRISBANE   ║ A  ║ 8.761043  ║ 0   ║ 
║   555 ║ FILTER  ║  187 ║ MAIN    ║ A  ║ 8.761043  ║ 1638.315041 ║ 
║   555 ║ FILTER  ║  0 ║ MELBOURNE   ║ A  ║ 8.761043  ║ 0   ║ 
║   555 ║ FILTER  ║  21 ║ PERTH    ║ A  ║ 8.761043  ║ 183.981903 ║ 
║   555 ║ FILTER  ║  0 ║ PATTISONS   ║ A  ║ 8.761043  ║ 0   ║ 
║   555 ║ FILTER  ║  12 ║ QLD Warehouse (1) ║ A  ║ 8.761043  ║ 105.132516 ║ 
║   555 ║ FILTER  ║  22 ║ SYDNEY   ║ A  ║ 8.761043  ║ 192.742946 ║ 
╚═════════════╩═════════════╩══════════╩═══════════════════╩════════╩══════════════╩═════════════╝ 


但是結果,我想編寫一個查詢,這將使我每個零件號的總數,如下所示(顯然,如果我爲所有倉庫顯示倉庫總量,則倉庫代碼變得多餘)

此查詢按零件號分組。

╔═════════════╦════════════════╦══════════╦════════╦══════════════╦═════════════╗ 
║ Part Number ║ Description ║ In Stock ║ Status ║ Average Cost ║ Stock Value ║ 
╠═════════════╬════════════════╬══════════╬════════╬══════════════╬═════════════╣ 
║  555 ║ WIX AIR FILTER ║  242 ║ A  ║ 8.761043  ║ 2120.172406 ║ 
╚═════════════╩════════════════╩══════════╩════════╩══════════════╩═════════════╝ 

我已經能夠得到工作的唯一查詢此

SELECT 
    InventoryItem.ItemName as 'Part Number', 
    InventoryItem 
    SUM(InventoryStockTotal.UnitsInStock) as 'In Stock', 
    AVG(InventoryItem.AverageCost) AS 'Average Cost', 
    (AVG(InventoryItem.AverageCost) * SUM(InventoryStockTotal.UnitsInStock)) AS 'Stock Value' 

FROM dbo.InventoryItemDescription 
INNER JOIN dbo.InventoryItem 
    ON InventoryItemDescription.ItemCode = InventoryItem.ItemCode 
INNER JOIN dbo.InventoryStockTotal 
    ON InventoryStockTotal.ItemCode = InventoryItem.ItemCode 

    GROUP BY InventoryItem.ItemName 

這給了我這個

╔═════════════╦════════════╦══════════════╦═════════════╗ 
║ Part Number ║ In Stock ║ Average Cost ║ Stock Value ║ 
╠═════════════╬════════════╬══════════════╬═════════════╣ 
║   555 ║ 242.000000 ║ 8.761043  ║ 2120.172406 ║ 
╚═════════════╩════════════╩══════════════╩═════════════╝ 

的問題

我需要在結果表中也包括項目描述和狀態代碼等,除了whe n個I嘗試將它們添加到它返回一個錯誤

Column 'dbo.InventoryItemDescription.ItemDescription' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. I understand the cause of this error because its trying to group a column that doesn't have an aggregate, but how can I get around this? 

的理想解決方案

的部分的數字說明將是每一個實例相同的select語句,是有一些方法可以讓我指示SQL僅選擇說明的第一個實例?

** EDIT 2 **

我可不可以利用SELECT DISTINCT功能?

+0

如果每個零件號的描述總是相同的,不要費心將其添加到group by子句中。您還可以利用'窗口'函數計算平均值/總額,同時保留每個描述或倉庫價值。 – qxg

+0

嗨,我沒有將它添加到組按條款....除非我沒有!我怎麼不把這個包含在group by子句中? –

回答

3

如果每個零件號的描述總是相同的,不要費心將它添加到group by子句中。

SELECT 
    InventoryItem.ItemName as 'Part Number', 
    InventoryItemDescription.ItemDescription as 'Description', 
    SUM(InventoryStockTotal.UnitsInStock) as 'In Stock', 
    FROM ... 
    GROUP BY InventoryItem.ItemName, InventoryItemDescription.ItemDescription 

您可以使用SELECT DISTINCT,這是一樣的GROUP BY

或者您可以利用窗口函數來計算平均/總計,同時仍保留每個描述或倉庫價值。

WITH CTE AS 
(
    SELECT 
     InventoryItem.ItemName as 'Part Number', 
     InventoryItemDescription.ItemDescription as 'Description', 
     InventoryStockTotal.WarehouseCode AS 'Warehouse', 
     InventoryItem.Status, 
     SUM(InventoryStockTotal.UnitsInStock) OVER (PARTITION BY InventoryItem.ItemName) as 'In Stock', 
     ROW_NUMBER() OVER() AS RowNumber 
     FROM 
     .... 
     // NO GROUP BY 
) 
SELECT colums 
FROM CTE 
WHERE RowNumber = 1 
+0

乾杯,那正是我需要的!第一個代碼示例執行此操作。你能解釋爲什麼在'GROUP BY'子句之後添加列不包含它嗎? –

+0

看看這篇[文章](http://blog.sqlauthority.com/2009/04/06/sql-server-logical-query-processing-phases-order-of-statement-execution/) – qxg