【发布时间】: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