【问题标题】:SQL Select from Different SourceSQL 从不同的源中选择
【发布时间】:2012-01-19 21:31:15
【问题描述】:

我真的不知道我在用 SQL 做什么,但我有两个表。我知道如果列相等,您可以从一个表中提取数据并将其添加到另一个表中。 所以我想要类似的东西:

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

基本上,orders 和 orderdetails 表是两个独立的表,但 orderdetails 具有将其与 orders 表中的订单相关联的 OrderID 元素。所以我的函数是 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 之类的东西是不必要的。请帮忙。

编辑:

选择 Orders.OrderID、Orders.SalesRep_CustomerID、Orders.Total_Payment_Received、Orders.SalesTax1、SumDetails.COGS、ISNULL(Total_Shipping_Cost.Shipping_Cost,0) 作为 Shipping_Cost

来自订单

加入

(SELECT OrderID, Sum(OrderDetails.Vendor_Price * OrderDetails.Quantity)

作为 COGS

来自订单详情

按订单 ID 分组)

AS SumDetails

在 SumDetails.OrderID=Orders.OrderID 左侧

加入

(SELECT OrderID, SUM(Shipment_Cost)

AS Shipping_Cost

来自追踪号码

按订单 ID 分组)

AS Total_Shipping_Cost

(选择案例

当 Orders.ShippingMethodID

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

那么 5

否则 0

结束)

AS 服务费

在 Total_Shipping_Cost.OrderID = Orders.OrderID

WHERE Orders.OrderStatus = '已发货'

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

AND Orders.PaymentAmount = Orders.Total_Payment_Received

【问题讨论】:

  • 这是 Microsoft SQL Server 吗?
  • 这可能是我见过的最痛苦的SQL
  • @SpectralGhost 我确定是这样,我无法终生编辑它
  • 我在下面回答并希望提供一些可以帮助解决原始查询的内容。

标签: sql sql-server select sum equals


【解决方案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

【讨论】:

  • 谢谢,但除了它有效之外,我对问题中所写的瓦特不屑一顾。 JBrooks 编写的代码也可以正常工作,所以因为它是轻量级的并且可能更好,唯一的问题是,我不知道如何在我的脚本中实现它。
  • 哦,哎呀错过了第一个脚本。我现在就测试一下。
  • 工作得很好,但我遇到的唯一问题是将它实现到我的脚本中,我的查询:SELECT Orders.OrderID,Orders.SalesRep_CustomerID,Orders.Total_Payment_Received,Orders.S‌​alesTax1 ,( SELECT SUM(Shipment_Cost) FROM Trackingnumbers WHERE Trackingnumbers.OrderID = Orders.OrderID ) AS Shipping_Cost,(SELECT SUM(OrderDetails.Vendor_Price * OrderDetails.Quantity) FROM OrderDetails WHERE Orders.OrderID = OrderDetails.OrderID) FROM Orders WHERE Orders.OrderStatus = 'Shipped' AND Orders.ShipDate &gt; (GETDATE()-6) AND Orders.PaymentAmount = Orders.Total_Payment_Received
【解决方案2】:

这就是 JOIN 的用途

在你的例子中,这就是你要做的

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/

这里有一篇关于 GROUP BY 的文章:http://www.sqlteam.com/article/how-to-use-group-by-in-sql-server

【讨论】:

    【解决方案3】:

    您是否正在寻找这样的东西:

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

    【讨论】:

      【解决方案4】:

      这应该让你开始:

      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
      

      编辑:从 Orders 添加其他列(这就是我喜欢子查询方法的原因 - 它们不必在 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
      

      【讨论】:

      • 这可以无缝运行,但我无法将它实施到我当前的查询中
      • 我当前的查询SELECT Orders.OrderID,Orders.SalesRep_CustomerID,Orders.Total_Payment_Received,Orders.SalesTax1 ,( SELECT SUM(Shipment_Cost) FROM Trackingnumbers WHERE Trackingnumbers.OrderID = Orders.OrderID ) AS Shipping_Cost,(SELECT SUM(OrderDetails.Vendor_Price * OrderDetails.Quantity) FROM OrderDetails WHERE Orders.OrderID = OrderDetails.OrderID) FROM Orders WHERE Orders.OrderStatus = 'Shipped' AND Orders.ShipDate &gt; (GETDATE()-6) AND Orders.PaymentAmount = Orders.Total_Payment_Received
      • @user1090389 查看编辑 - 这应该是您当前查询中的所有内容。
      • 工作出色!非常感谢。
      • 如何添加某种子句,我想做类似的事情,WHERE Orders.ShippingMethodID=19 OR 20 OR 21 OR 25 OR 26 OR 27 OR 28 OR 30 OR 31 OR 502 然后如果订单的运输方式 ID 是上述之一,请添加一个新列并在具有其中一种运输方式的订单的单元格中填写“5”,或者在具有其中一种运输方式的订单中将 5 添加到 Shipping_Cost。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-15
      • 2011-09-28
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多