SQL SELECT多列求和

4

我正在尝试在同时进行其他选择操作时执行选择SUM。 我当前的脚本:

SELECT Orders.OrderID,SUM(Trackingnumbers.Shipment_Cost) AS Shipping_Cost
FROM Orders 
INNER JOIN Trackingnumbers
ON Orders.OrderID = TrackingNumbers.OrderID
WHERE Orders.OrderStatus = 'Shipped' AND Orders.ShipDate > (GETDATE()-6) AND Orders.PaymentAmount = Orders.Total_Payment_Received
Group By Orders.OrderID

我想选择更多的列,但由于我正在使用SUM函数,所以无法实现。我该如何将SUM函数与其他属性分开,使得CSV文件中有所有列以及Trackingnumber.Shipment_Cost的总和在一列中呈现?

4个回答

9
您可以使用子查询。
SELECT *
    ,(
        SELECT SUM(Shipment_Cost)
        FROM Trackingnumbers
        WHERE Trackingnumbers.OrderID = Orders.OrderID
    ) AS Shipping_Cost
FROM Orders
WHERE Orders.OrderStatus = 'Shipped'
    AND Orders.ShipDate > (GETDATE()-6)
    AND Orders.PaymentAmount = Orders.Total_Payment_Received

@user1090389 我猜你只是想要 Orders 表中的列,这应该可以通过 * 或从该表中选择自己的列来完成。 - Peter Majeed
我尝试着加入自己的代码,但它不起作用。使用 * 可以工作,但当我将 * 替换为 Orders.SalesRepCustomerID,Orders.COGS 时,它就无法工作了。 - henryaaron
@user1090389 尝试只选择这两列(SalesRepCustomerIDCOGS),然后从FROM子句开始的所有内容。如果可以,请尝试在其后引入子查询(应该可以工作)。 - Peter Majeed
而取而代之的是我选择的列。 - henryaaron
@user1090389,您可以删除星号并放入您自己选择的任何列,这不会影响Shipping_Cost子查询中使用命名列的效果。当您运行查询时,您的RDBMS给出了什么错误?(我提到了我的上面的评论,以查看列名是否有误,因为选择所有列是有效的。) - Peter Majeed
显示剩余2条评论

3
这里的想法是您正在使用聚合查询(带有GROUP BY)。这意味着您返回的列通常应该是聚合函数的结果或您正在分组的内容。
根据您使用的平台,一些平台有一个“First”函数,这可能很有用。

2

有几种不同的方法可以获得它。

I. 对于您想在结果中拥有的每个列应用聚合函数。

SELECT Orders.OrderID, MAX(Orders.ShipDate) As ShipDate, MAX(Orders.OrderStatus) As OrderStatus, SUM(Trackingnumbers.Shipment_Cost) AS Shipping_Cost
FROM Orders 
INNER JOIN Trackingnumbers
ON Orders.OrderID = TrackingNumbers.OrderID
WHERE Orders.OrderStatus = 'Shipped' AND Orders.ShipDate > (GETDATE()-6) AND Orders.PaymentAmount = Orders.Total_Payment_Received
Group By Orders.OrderID

II. 将所有字段放入GROUP BY子句中

SELECT Orders.OrderID, Orders.ShipDate, Orders.OrderStatus, SUM(Trackingnumbers.Shipment_Cost) AS Shipping_Cost
FROM Orders 
INNER JOIN Trackingnumbers
ON Orders.OrderID = TrackingNumbers.OrderID
WHERE Orders.OrderStatus = 'Shipped' AND Orders.ShipDate > (GETDATE()-6) AND Orders.PaymentAmount = Orders.Total_Payment_Received

III. 使用子查询

SELECT *, (SELECT SUM(Trackingnumbers.Shipment_Cost)
FROM Trackingnumbers
WHERE TrackingNumbers.OrderID=Orders.OrderID) AS Shipping_Cost
WHERE Orders.OrderStatus = 'Shipped' AND Orders.ShipDate > (GETDATE()-6) AND    Orders.PaymentAmount = Orders.Total_Payment_Received FROM Orders

似乎无法正确设置SQL格式,尝试在其中使用lang-sql,但没有成功。 - Gabriel

0

您可以根据查询结果执行另一个查询,例如:

select b.aaa,b.bbb from (
    SELECT Orders.OrderID,SUM(Trackingnumbers.Shipment_Cost) AS Shipping_Cost
FROM Orders 
INNER JOIN Trackingnumbers
ON Orders.OrderID = TrackingNumbers.OrderID
WHERE Orders.OrderStatus = 'Shipped' AND Orders.ShipDate > (GETDATE()-6) AND Orders.PaymentAmount = Orders.Total_Payment_Received
Group By Orders.OrderID) as a,Orders b where a.OrderID = b.OrderID.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接