有两个表,OrderID和Order Details。
订单:
OrderID PK
Freight
|....|
订单明细:
OrderID PK FK
ProductID PK FK
UnitPrice
Quantity
|....|
每个OrderID
对于Orders
都是唯一的,但订单明细可以包含相同OrderID
和不同ProductId
,UnitPrice
等的若干详细信息。
因此,在订单明细中,我们可以看到两个,三个或更多订单(OrderID
)。
我的任务是选择所有运费记录的实际地址,其超过整个订单运费的总成本> UnitPrice * Quantity *(订单明细中的OrderID数量)
SELECT %%physloc%%
FROM Orders
WHERE Freight > (SELECT SUM(UnitPrice * Quantity)
FROM [Order Details]
GROUP BY OrderID);
当然,我有
'子查询返回的值超过1个......'
我尝试使用Top但在这种情况下我的选择错误。
我需要的只是比较每个Freight与OrderID记录以及来自该子查询的每个记录具有相同的OrderID。但我不知道怎么做。
也许有人可以找到不同的方式,这会很棒。
我使用SQL Server 2008
谢谢大家。
答案 0 :(得分:1)
最简单的思考方法如下:
外部查询处理Orders表中的每条记录。发生这种情况时,当前的OrderID与子查询共享。这可以通过子查询"其中"声明。这将确保在子查询中求和的数据具有相同的OrderID。
使用别名使得引用表比指定每个表及其相应列的全名更容易。格式:tableName.Column例如Orders.OrderID。更容易的替代别名.Column例如o.OrderID在哪里" o"被定义为Orders的别名。
SELECT %%physloc%%
FROM Orders o
WHERE Freight > (SELECT SUM(UnitPrice * Quantity)
FROM [Order Details] od
WHERE od.OrderID = o.OrderID
GROUP BY OrderID);
答案 1 :(得分:1)
我的任务是选择所有运费记录的实际地址,其超过整个订单运费的总成本> UnitPrice * Quantity *(订单明细中的OrderID数量)
您可以通过使用别名并按以下方式过滤子查询来轻松实现...
SELECT %%physloc%%
FROM Orders o
WHERE o.Freight > (SELECT SUM(od.UnitPrice * od.Quantity)
FROM [Order Details] as od
WHERE od.OrderId = o.OrderId);
您根本不需要group by
条款,因为它可能会对结果进行拆分/分组。通过使用sum
聚合函数,您已经返回了一个标量值,可以通过where
子句进一步过滤
答案 2 :(得分:1)
您应该加入要使用的查询。
SELECT
*
FROM Orders as o
INNER JOIN (SELECT od.OrderId, SUM(od.UnitPrice * od.Quantity) as Total
FROM Details as od
GROUP BY od.OrderId) as d ON d.orderId = o.Id
WHERE o.Freight > d.Total;
http://sqlfiddle.com/#!6/a151f/6
编辑:
另请注意,您将OrderId作为Orders表的主键,这通常是外键的注释。