2011-12-14 39 views
1

我真的不知道我在用SQL做什麼,但我有兩個表。我知道如果列是相同的,你可以從一個表中提取數據並將其添加到另一個表中。 所以我想是這樣的:SQL從不同的來源選擇

SELECT Sum(OrderDetails.Vendor_Price * OrderDetails.Quantity) 
WHERE Orders.OrderID=OrderDetails.OrderID 
AS COGS 

基本上,訂單和OrderDetails表是兩個獨立的表,但ORDERDETAILS有它關聯到Orders表的順序將訂單元素。所以我的函數是Orders.OrderID = OrderDetails.OrderID的地方,這是實現總和的地方,我希望每個訂單。 我能找到一個示例代碼,做這個任務有大量多餘代碼:

SELECT orders.orderid, 
     orders.cogs 
FROM (SELECT orders.orderid, 
       orderdetails.cogs 
     FROM (SELECT orders.orderid AS orderid 
       FROM (((orders WITH(nolock) 
          LEFT JOIN paymentmethods WITH(nolock) 
          ON orders.paymentmethodid = 
           paymentmethods.paymentmethodid) 
         LEFT JOIN shippingmethods WITH(nolock) 
          ON orders.shippingmethodid = 
           shippingmethods.shippingmethodid) 
         LEFT JOIN customers WITH(nolock) 
          ON orders.customerid = customers.customerid) 
       GROUP BY orders.orderid) orders 
       INNER JOIN (SELECT 
          orders.orderid 
          AS orderid, 
            COUNT(orderdetails.orderdetailid) 
          AS 
                  orderdetails_count 
                  , 
            SUM(orderdetails.quantity) 
                  AS quantity, 
            SUM(orderdetails.vendor_price * 
          orderdetails.quantity) AS 
                  cogs, 
            CASE 
            WHEN SUM(vendor_price) IS NULL THEN NULL 
            ELSE SUM((CASE 
               WHEN orderdetails.productcode 
                 LIKE 
                 'DSC-%' 
               THEN 
               orderdetails.productprice 
               - Isnull(
               orderdetails.vendor_price, 0) 
               ELSE orderdetails.productprice 
                 - 
                 orderdetails.vendor_price 
               END) * orderdetails.quantity) 
            END 
          AS 
                  profit, 
            CASE SUM(orderdetails.productprice * 
          orderdetails.quantity) 
            WHEN 0 THEN 0 
            ELSE Round(((SUM(orderdetails.productprice 
                 * 
                 orderdetails.quantity) 
                - SUM(
                orderdetails.vendor_price * 
                orderdetails.quantity))/
SUM(
      orderdetails.productprice 
      * 
      orderdetails.quantity)) 
* 100, 
1) 
END 
AS 
      profitmargin 
FROM (((orders WITH(nolock) 
LEFT JOIN paymentmethods WITH(nolock) 
ON orders.paymentmethodid = 
paymentmethods.paymentmethodid) 
LEFT JOIN shippingmethods WITH(nolock) 
ON orders.shippingmethodid = 
shippingmethods.shippingmethodid) 
LEFT JOIN customers WITH(nolock) 
ON orders.customerid = customers.customerid) 
LEFT JOIN orderdetails WITH(nolock) 
ON orders.orderid = orderdetails.orderid 
WHERE orders.orderstatus <> 'Cancelled' 
GROUP BY orders.orderid) orderdetails 
ON orders.orderid = orderdetails.orderid) orders 
ORDER BY orders.orderid DESC 

這基本上提供訂單和他們的COGS每個訂單到表中。但是,每次我嘗試刪除一行多餘的代碼時,都會出現錯誤。諸如ShippingMethodID之類的東西是不必要的。請幫忙。

編輯:

SELECT Orders.OrderID,Orders.SalesRep_CustomerID,Orders.Total_Payment_Received,Orders.SalesTax1,SumDetails.COGS,ISNULL(Total_Shipping_Cost.Shipping_Cost,0)作爲Shipping_Cost

FROM訂單

JOIN

(選擇的OrderID,SUM(OrderDetails.Vendor_Price * OrderDetails.Quantity)

AS COGS

FROM訂單明細

GROUP BY訂單ID)

JOIN

SumDetails

ON SumDetails.OrderID = Orders.OrderID(SELECT的OrderID,SUM (Shipment_Cost)

AS Shipping_Cost

FROM Trackingnumbers

GROUP BY訂單ID)

AS Total_Shipping_Cost

(SELECT CASE

WHEN Orders.ShippingMethodID

在(19,20,21, 25,26,27,28,30,31,502)

THEN 5

ELSE 0

END)

AS ServiceCharge

ON Total_Shipping_Cost.OrderID =訂單。訂單ID

WHERE Orders.OrderStatus = '已發貨'

和Orders.ShipDate>(GETDATE() - 6)

和Orders.PaymentAmount = Orders.Total_Payment_Received

+0

這是Microsoft SQL Server嗎? – UnhandledExcepSean 2011-12-14 02:31:08

+0

是的。 dotdotdotdot – henryaaron 2011-12-14 02:36:09

+0

這可能是我見過的最痛苦的SQL – UnhandledExcepSean 2011-12-14 02:56:25

回答

1

這應該讓你開始:

SELECT Orders.OrderID, 
SumDetails.COGS 
FROM Orders 
JOIN 
    (SELECT OrderID, 
    Sum(OrderDetails.Vendor_Price * OrderDetails.Quantity) AS COGS 
    FROM OrderDetails 
    GROUP BY OrderID) AS SumDetails 
ON SumDetails.OrderID=Orders.OrderID 

編輯:要在其他列從加訂單(這就是爲什麼我喜歡子查詢方法 - 它們不必位於GROUP BY中):

SELECT Orders.OrderID, 
Orders.SalesRep_CustomerID, 
Orders.Total_Payment_Received, 
Orders.S‌​alesTax1, 
SumDetails.COGS, 
ISNULL(Total_Shipping_Cost.Shipping_Cost,0) as Shipping_Cost 
FROM Orders 
JOIN 
    (SELECT OrderID, 
    Sum(OrderDetails.Vendor_Price * OrderDetails.Quantity) AS COGS 
    FROM OrderDetails 
    GROUP BY OrderID) AS SumDetails 
ON SumDetails.OrderID=Orders.OrderID 
LEFT JOIN 
    (SELECT OrderID, 
    SUM(Shipment_Cost) AS Shipping_Cost 
    FROM Trackingnumbers 
    GROUP BY OrderID) AS Total_Shipping_Cost 
ON Total_Shipping_Cost.OrderID = Orders.OrderID 
WHERE Orders.OrderStatus = 'Shipped' 
AND Orders.ShipDate > (GETDATE()-6) 
AND Orders.PaymentAmount = Orders.Total_Payment_Received 
1

要回答你的問題

SELECT Orders.OrderID,Sum(OrderDetails.Vendor_Price * OrderDetails.Quantity) AS COGS 
FROM Orders 
INNER JOIN OrderDetails ON Orders.OrderID=OrderDetails.OrderID 
GROUP BY Orders.OrderID 

我相信這相當於你有什麼...我希望這將有助於,因爲我在想你想要什麼可能不會考慮到交流統計正在發生的事情的當前邏輯。

SELECT 
    orders.orderid AS orderid, 
    COUNT(orderdetails.orderdetailid) AS orderdetails_count, 
    SUM(orderdetails.quantity) AS quantity, 
    SUM(orderdetails.vendor_price * orderdetails.quantity) AS cogs, 
    CASE 
     WHEN SUM(vendor_price) IS NULL THEN NULL 
     ELSE SUM(
        CASE 
         WHEN orderdetails.productcode LIKE 'DSC-%' THEN (orderdetails.productprice - Isnull(orderdetails.vendor_price, 0))* orderdetails.quantity 
         ELSE (orderdetails.productprice-orderdetails.vendor_price)* orderdetails.quantity 
        END 
       ) 
    END AS profit, 
    CASE SUM(orderdetails.productprice *orderdetails.quantity) 
     WHEN 0 THEN 0 
     ELSE Round(((SUM(orderdetails.productprice * orderdetails.quantity) - SUM(orderdetails.vendor_price * orderdetails.quantity))/SUM(orderdetails.productprice * orderdetails.quantity)) * 100,1) 
    END AS profitmargin 
FROM orders WITH(nolock) 
LEFT JOIN paymentmethods WITH(nolock) ON orders.paymentmethodid = paymentmethods.paymentmethodid 
LEFT JOIN shippingmethods WITH(nolock) ON orders.shippingmethodid = shippingmethods.shippingmethodid 
LEFT JOIN customers WITH(nolock) ON orders.customerid = customers.customerid 
LEFT JOIN orderdetails WITH(nolock) ON orders.orderid = orderdetails.orderid 
WHERE orders.orderstatus <> 'Cancelled' 
GROUP BY orders.orderid 
ORDER BY orders.orderid DESC 
2

這就是連接是用於

在你的榜樣,這是你會做什麼

SELECT Orders.OrderId, SUM(OrderDetails.Vendor_Price * OrderDetails.Quantity) 
FROM Orders 
     INNER JOIN OrderDetails 
      ON Orders.OrderId = OrderDetails.OrderId 
GROUP BY Orders.OrderId 

有噸的文章在網上,你可以閱讀了關於加入和聚合數據

鏈接到解釋連接的文章http://blog.sqlauthority.com/2009/04/13/sql-server-introduction-to-joins-basic-of-joins/

下面是通過在組的文章:http://www.sqlteam.com/article/how-to-use-group-by-in-sql-server

0

您正在尋找這樣的事情:

SELECT Orders.OrderID, Sum(OrderDetails.Vendor_Price * OrderDetails.Quantity) 
FROM Orders 
INNER JOIN OrderDetails on Orders.OrderID = OrderDetails.OrderID 
WHERE .... 
GROUP BY Orders.OrderID