2016-05-12 18 views
1

habe ich den ersten Teil der Abfrage, die die Gesamtmenge eines Produkts zur Zeit warten zeigt an Kunden versandt & mir die Artikelnummer aus der Item Tabelle zurückgibt -Benötige ich eine Unterabfrage in der SQL-Ansicht?

SELECT 
    [Item].[ItemNum], 
    SUM([Sales].[Quantity]) AS [Qty] 
FROM [dbo].[Item] 
LEFT OUTER JOIN [dbo].[Sales] 
    ON [Item].[ItemNum] = [Sales].[ItemNum] 
WHERE ([Sales].[Sale Type] = 1) 
GROUP BY [Item].[ItemNum] 

Das funktioniert gut, ich die Katalognummer des Artikels und wie viele sind bestellt. Jetzt muss ich mich einem anderen Tisch anschließen, der mir einen Vorrat an Gegenständen zeigt. So sieht die Abfrage aus -

SELECT 
    [Item].[ItemNum] SUM ([Sales].[Quantity]) AS [Qty], SUM ([Stock].[Remaining Quantity]) 
AS [Free Stock] 
FROM [dbo].[Item] 
LEFT OUTER JOIN dbo.[Sales] 
    ON [Item].[ItemNu]m = [Sales].[ItemNum] 
LEFT OUTER JOIN [dbo].[Stock] 
    ON [Item].[ItemNum] = [Stock].[ItemNum] 
WHERE ([Sales].[Document Type] = 1) 
GROUP BY [Item].[ItemNum] 

Jetzt ist die Menge auf Bestellung ist aus und die Menge auf Lager ist auch falsch. Da ich das "Wo" auf die Verkaufstabelle angewendet habe, es aber nicht auf die Lagerliste zutrifft, muss ich es auslagern?

Dank

+1

ohne einige Beispieldaten zu sehen, dass das Problem etwas erzeugt wird, um sei an dieser Stelle raten. –

Antwort

0

In diesem Fall Common Table Expression ist nützlich:

With CTE As (
SELECT 
    [Item].[ItemNum], 
    SUM([Sales].[Quantity]) AS [Qty] 
FROM [dbo].[Item] 
LEFT OUTER JOIN [dbo].[Sales] 
    ON [Item].[ItemNum] = [Sales].[ItemNum] 
WHERE ([Sales].[Sale Type] = 1) 
GROUP BY [Item].[ItemNum] 
) 
    Select * 
    From CTE Left Outer Join 
    [dbo].[Stock] 
    ON [CTE].[ItemNum] = [Stock].[ItemNum] 
+0

Ja, ich bin jetzt ein bisschen näher! Meine Bestandsmenge ist jetzt korrekt, aber die Verkaufsmenge (aus CTE) ist immer noch falsch. Versuchen herauszufinden, warum das so sein könnte. – SeekWhat

+0

Ich endete mit mehreren CTE's - vielen Dank für Ihre Hilfe! – SeekWhat

1

Ich weiß nicht, ob es das Problem zu beheben, aber die where-Klausel der linken Seite dreht kommen in einen inneren verbinden. Versuchen Sie es stattdessen.

SELECT 
    dbo.[databasename$Item].ItemNum, SUM (dbo.[databasename$Sales].Quantity) AS [Qty], SUM (dbo.[databasename$Stock.[Remaining Quantity]) 
AS [Free Stock] 
FROM dbo.[databasename$Item] 
LEFT OUTER JOIN dbo.[databasename$Sales] 
    ON dbo.[databasename$Item].ItemNum = dbo.[databasename$Sales].ItemNum 
    AND (dbo.[databasename$Sales].[Document Type] = 1) 
LEFT OUTER JOIN dbo.[databasename$Stock] 
    ON dbo.[databasename$Item].ItemNum = dbo.[databasename$Stock].[ItemNum] 
GROUP BY dbo.[databasename$Item].ItemNum 

die Sie interessieren und sehen, ob es das Problem behebt:

SELECT 
    dbo.[databasename$Item].ItemNum, [databasename$Sales].Quantity) AS [Qty], [databasename$Stock.[Remaining Quantity]) 
AS [Free Stock] 
FROM dbo.[databasename$Item] 
LEFT OUTER JOIN (select ItemNum, sum(quantity) as Quantity from dbo.[databasename$Sales] where Document Type = 1group by ItemNum) as databasename$Sales 
    ON dbo.[databasename$Item].ItemNum = [databasename$Sales].ItemNum 
LEFT OUTER JOIN (select ItemNum, sum(quantity) as RemainingQuantity from dbo.[databasename$Stock]roup by ItemNum) 
as databasename$Stock 
    ON dbo.[databasename$Item].ItemNum = [databasename$Stock].[ItemNum] 
GROUP BY dbo.[databasename$Item].ItemNum 
+0

Vielen Dank für die Antwort, aber es hat das Problem nicht gelöst. – SeekWhat

+0

Aber es wird Sie davon abhalten, Datensätze herauszufiltern, die Sie nicht herausfiltern wollten. Sie sollten dies lesen: http: //wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN – HLGEM

+0

Sorry, sollte gesagt haben, dass es das ursprüngliche Problem nicht behoben hat, aber ich sehe jetzt, wie es mit der Abfrage im Allgemeinen helfen wird. – SeekWhat