2016-04-21 11 views
2

Ich habe eine SQL-Abfrage geschrieben, die die Lagerbestände in jedem unserer Lager wie folgt berechnet.Wie könnte ich eine Beschreibungsspalte zusammenfassen?

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 


Das gibt mir ein Ergebnis wie dieses


╔═════════════╦═════════════╦══════════╦═══════════════════╦════════╦══════════════╦═════════════╗ 
║ 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 ║ 
╚═════════════╩═════════════╩══════════╩═══════════════════╩════════╩══════════════╩═════════════╝ 


aber ich versuche, eine Abfrage zu schreiben, die mir geben die TOTAL für jede Teilenummer , wie folgt (offensichtlich wird der Lagercode überflüssig, wenn ich für alle Lager insgesamt anzeigen)

Diese Abfrage gruppiert nach der Teilenummer.

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

Die einzige Abfrage, die ich habe in der Lage, zur Arbeit zu bekommen, ist dies

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 

Was mir dieses

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

DAS PROBLEM

Ich brauche gibt zu Geben Sie auch die Artikelbeschreibung und den Statuscode in die Ergebnistabelle ein, außer whe n Ich versuche, und fügen Sie sie in der select-Anweisung es einen Fehler zurückgibt

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? 

die ideale Lösung

Die Beschreibung für die Teilenummern wird das gleiche für jede Instanz sein, ist es eine Möglichkeit, ich kann SQL anweisen, nur die erste Instanz der Beschreibung auszuwählen?

** EDIT 2 **

Kann ich nutzen möglicherweise die SELECT DISTINCT Funktion?

+0

Wenn die Beschreibung für jede Teilenummer immer gleich ist, fügen Sie sie nicht der Klausel group by hinzu. Sie können auch die "Fenster" -Funktion nutzen, um avg/total zu berechnen, während Sie weiterhin jede Beschreibung oder jeden Lagerwert behalten. – qxg

+0

Hallo, ich habe es nicht zur Gruppe nach Klausel hinzugefügt .... es sei denn, ich tat es !!! Wie würde ich das nicht in die Gruppenklausel aufnehmen? –

Antwort

3

Wenn die Beschreibung für jede Teilenummer immer gleich ist, fügen Sie sie nicht der Gruppenklausel hinzu.

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

können Sie verwenden SELECT DISTINCT, die die gleiche wie GROUP BY ist.

Oder Sie können Fensterfunktion nutzen, um AVG/total zu berechnen, während Sie weiterhin jede Beschreibung oder jeden Lagerwert behalten.

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

Prost, genau das brauche ich! Das erste Codebeispiel macht es. Können Sie erklären, warum das Hinzufügen der Spalte nach der GROUP BY -Klausel dies NICHT beinhaltet? –

+0

Überprüfen Sie diese [Artikel] (http://blog.sqlauthority.com/2009/04/06/sql-server-logical-query-processing-phase-order-of-statement-execution/) – qxg

Verwandte Themen