SQL查询:需要筛选帮助

时间:2009-12-13 10:34:12

标签: sql count normalization

我有2个表。一个是OrderMaster,第二个是OrderDetails.Both通过OrderId连接

订单表字段:OrderId(主键),总计,订单日期

OrderDetail字段:OrderDetailId,ItemId,SupplierId,Amount,OrderId(ForiegnKey)

一个订单可以有多个orderdetail记录,可以来自不同的供应商

现在我想获得仅具有特定供应商ID值(例如:4)和计数(不同供应商ID)= 2的订单。具有此供应商ID的所有订单不应包括在结果集中,因为其中一些订单可能还有其他供应商。预期产量是   OrderId,Sum *属于特定供应商的那些记录的金额(订单中只有该供应商)

编辑:我认为Count(supplierId)= 1应该是查询的一部分。

3 个答案:

答案 0 :(得分:1)

尝试这样的事情:

select OrderId, Sum(Amount) 
from OrderDetail 
where SupplierId = 4 
group by OrderId

答案 1 :(得分:1)

这是选择仅有一个特定供应商的订单的一种方法。 where子句查找该供应商的详细信息,并过滤掉混合供应商的订单。然后计算每个细节行的总计。

select     od.OrderId
,          sum(od.Sum * od.Amount) as Total
from       OrderDetails od
where      od.SupplierId = 4
and        not exists (
           select   *
           from     OrderDetails od2
           where    od2.OrderId = od.OrderId
           and      od2.SupplierId <> od.SupplierId
           )
group by   od.OrderId

我不确定sum是否正确;这里它将Sum列与Amount列相乘。如果你只需要金额,你可以这样写:

,          sum(od.Amount) as Total

不需要加入OrderMaster,因为我们可以从详细信息表中获取OrderId。

答案 2 :(得分:0)

你可以尝试这样的事情。

DECLARE @Supl INT

SELECT @Supl = 4

SELECT  om.OrderID,
        SUM(Amount) TotalForSupplier
FROm    OrderMaster om INNER JOIN
        OrderDetails od ON om.OrderID = od.OrderID
WHERE   od.SupplierId = @Supl
GROUP BY om.OrderID

这将为您提供订单供应商的总数。

这可能包括价格字段,

SUM(金额*价格)

如果您希望只拥有 OrderID Total ,则可以排除内部联接

SELECT  od.OrderID,
    SUM(od.Amount) TotalForSupplier
FROm    OrderDetails od
WHERE   od.SupplierId = @Supl
GROUP BY od.OrderID