2017-08-26 2 views
1

Die folgende Abfrage erhalten Gesamtumsatz für bestimmte Steckdose.Summe in SQL Server

Ausgang:

SourceName  Amount 
------------------------ 
Call Center  2997.00 
Delivero Credit 5879.00 
Eat Easily Cash 57.00 

Wenn ich eine Liste der Filialen haben, Auslass 1 und Ausgang 2 zum Beispiel möchte ich so für jeden Ausgang einen Gesamtumsatz von Quelle erhalten und wenn es keine Verkäufe Verkaufswert Betrag sollte sei null, also wird out put sein.

SourceName  outlet 1 outlet 2 
----------------------------------- 
Call Center  2997.00 500 
Delivero Credit 5879.00  0 
Eat Easily Cash 57.00  66 

Das Problem auf der folgenden Abfrage sollte es doppelte Summe DeliveryCharge es SUM((OrderDetails.Quantity * OrderDetails.UnitPrice)) + Orders.DeliveryCharge - ((SUM((OrderDetails.Quantity * OrderDetails.UnitPrice))) * Orders.Discount/100) seine

Aktualisiert Abfrage:

SELECT 
    s.SourceName, 
    SUM(CASE 
      WHEN o.OutletID ='1' THEN ((ord.Quantity * ord.UnitPrice) + ordd.DeliveryCharge) 
      ELSE 0 
     END) AS [Outlet 1], 
    SUM(CASE 
      WHEN o.OutletID ='1' THEN ((ord.Quantity * ord.UnitPrice) + ordd.DeliveryCharge) 
      ELSE 0 
     END) AS [Outlet 2] 
FROM 
    dbo.Orders ordd 
INNER JOIN 
    dbo.Outlets o ON ordd.OutletID = o.OutletID 
INNER JOIN 
    dbo.OrderDetails ord ON ord.OrderID = ordd.OrderID 
LEFT OUTER JOIN 
    dbo.Sources s ON s.SourceID = ordd.SourceID 
WHERE 
    ordd.OrderID NOT IN (SELECT CanceledOrders.OrderID 
         FROM CanceledOrders) 
    AND ordd.OrderDate BETWEEN '2017-05-1 10:00:00.000' AND '2017-06-1 04:00:00.000' 
GROUP BY 
    s.SourceID, s.SourceName 
ORDER BY 
    s.SourceName 
+1

Sie müssen uns hier einige Daten zeigen. Bei einer Abfrage mit 4 Tabellen und 3 Joins ist es schwierig zu erraten, wie Ihre Daten aussehen könnten. –

+0

siehe Update pls .. – Ayman

Antwort

1

Sie sind zur Gruppierung zweimal durch die Quellennamen, die keinen Sinn machen mir. Abgesehen davon denke ich, dass Sie die gewünschte Ausgabe erhalten können, indem Sie den Namen des Ausgangs aus GROUP BY entfernen und stattdessen auf dieser Spalte schwenken. Darüber hinaus habe ich Ihre Abfrage so strukturiert, dass Auftragsdetails in einer Unterabfrage für jede Bestellung zusammengefasst werden. Dies sollte das Problem der Duplikation umgehen, das Sie für die Liefergebühr und möglicherweise andere Felder sahen.

WITH MyGroupCte AS (
    SELECT 
     s.SourceName, 
     SUM(CASE WHEN out.OutletName = 'outlet 1' 
       THEN ((1 - (o.Discount/100)) * od.OrderPrice) + o.DeliveryCharge 
       ELSE 0 END) AS [outlet 1], 
     SUM(CASE WHEN out.OutletName = 'outlet 2' 
       THEN ((1 - (o.Discount/100)) * od.OrderPrice) + o.DeliveryCharge 
       ELSE 0 END) AS [outlet 2] 
    FROM dbo.Orders AS o 
    INNER JOIN dbo.Outlets AS out 
     ON o.OutletID = out.OutletID 
    INNER JOIN 
    (
     SELECT 
      OrderID, 
      SUM(od.Quantity * od.UnitPrice) AS orderPrice 
     FROM dbo.OrderDetails 
     GROUP BY OrderId 
    ) od 
     ON od.OrderID = o.OrderID 
    INNER JOIN dbo.Sources AS s 
     ON s.SourceID = o.SourceID 
    WHERE 
     out.OutletID = '6' AND 
     o.OrderID NOT IN (SELECT OrderID FROM CanceledOrders) AND 
     o.OrderDate 
      BETWEEN '2017-05-1 10:00:00.000' AND '2017-06-1 04:00:00.000' 
    GROUP BY 
     o.OrderID, 
     s.SourceName 
) 

SELECT 
    SourceName, 
    [outlet 1], 
    [outlet 2] 
FROM MyGroupCte; 

Bitte beachten Sie die Verwendung von Aliasen, die Ihre Abfrage wesentlich einfacher lesen und formatieren.

+0

Ich habe versucht, die Abfrage, aber die Quellen sind – Ayman

+0

wiederholt und auch ich summiere SUM ((OrderDetails.Quantity * OrderDetails.UnitPrice)) Versandkosten wird hinzugefügt – Ayman

+0

Sie gaben uns keine Daten zu gehen. Meine Antwort ist vernünftig angesichts der von Ihnen angegebenen Informationen. –