2017-08-26 25 views
1

以下のクエリは、特定のアウトレットの合計売上高を取得します。SQL Serverの合計ケース

出力:

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

私は例えばコンセント、コンセント1と出口2のリストを持っている場合は、私が各コンセントのソースで総売上高を取得したいとそこがない場合は、販売売上金額値すべき出てくるのでゼロにする。

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

以下のクエリ上の問題は、それが二重の合計DeliveryCharge それがあるべきSUM((OrderDetails.Quantity * OrderDetails.UnitPrice)) + Orders.DeliveryCharge - ((SUM((OrderDetails.Quantity * OrderDetails.UnitPrice))) * Orders.Discount/100)

更新クエリ:現在、意味をなさないソース名、2回グループ化されている

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

ここにいくつかのデータを表示する必要があります。 4つのテーブルと3つの結合を含むクエリでは、データが何であるかを推測することは困難です。 –

+0

更新を参照してください.. – Ayman

答えて

1

私に。それ以外には、コンセント名をGROUP BYから削除し、その列をピボットすることで、必要な出力を得ることができると思います。さらに、私はあなたのクエリをリファクタリングして、各注文のサブクエリで注文詳細を集計しました。これは、配送料金や他のフィールドで見られる重複の問題を回避する必要があります。

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; 

読んでフォーマットするクエリがはるかに簡単にするエイリアスを、使用することを検討してください。

+0

私はクエリを試しましたが、ソースは – Ayman

+0

と繰り返しています。またSUM((OrderDetails.Quantity * OrderDetails.UnitPrice))を加算しています) – Ayman

+0

あなたは私達にデータを渡しませんでした。あなたが提供した情報があれば私の答えは合理的です。 –