HAVING和WHERE,SQL Server之间的混淆

时间:2016-02-28 15:21:01

标签: sql-server where-clause having-clause

我正在尝试获取其产品数量(SUM)等于零的所有供应商。这是我到目前为止所做的,但它没有返回任何行,也没有给出任何错误。我确保有数量为零的产品,并且脚本在适当的数据库上运行。

select 
    VI.Name, Cp.ProductName
from
    VendorInfo VI 
inner join 
    VendorTrading VT on VI.Id = VT.VendorId 
inner join 
    CustomerProducts CP on VT.Id = CP.VendorTradingId
group by 
    VI.Name, CP.ProductName
having
    sum(CP.ProductQuantity) = 0

我对HAVINGWHERE感到困惑。我该怎么办?

更新

这是VendorInfo表:

enter image description here

这是VendorTrading表:

enter image description here

这是CustomerProduct表:

enter image description here

现在预期的结果应该是:

enter image description here

将有多行相同的产品但具有不同的Tradedate,因此它应首先SUM所有产品数量,如果它等于零,则返回VendorName和Product name,它在某段时间内具有0产品数量。之后我还需要产品数量为0的供应商总数。 希望它能清除一切

3 个答案:

答案 0 :(得分:0)

我认为您的问题是这样的:如果供应商的产品数量为零,那么该供应商的交易表中将没有行,并且内部联接的结果中也没有。您需要执行以下操作:

select VI.Name, Cp.ProductName
FROM VendorInfo VI 
LEFT OUTER join VendorTrading VT  
on VI.Id = VT.VendorId 
LEFT OUTER join CustomerProducts CP 
on VT.Id = CP.VendorTradingId
GROUP BY VI.Name, CP.ProductName
HAVING  SUM( CP.ProductQuantity ) = 0

然后你用HAVING子句做的是正确的。

答案 1 :(得分:0)

我认为你应该添加WHERE TradeDate = 'datehere',因为你的样本是:

WITH VendorInfo AS (
SELECT  2 as Id,
        100 as Code,
        'Yousuf M/s' as Name
),
VendorTrading AS (
SELECT  1 as Id,
        2 as VendorId,
        '2015-12-25' as TradeDate
),
CustomerProducts AS (
SELECT * FROM (VALUES
(1, 1, 'ULTRA', 0),
(2, 1, 'EXTASY', 5),
(3, 1, 'XXL', 5),
(4, 1, 'KPT', 5),
(5, 1, 'ORANGE', 5),
(6, 1, 'STRAWBERRY', 5),
(7, 1, 'PERFORM', 5),
(8, 1, 'INTENSE', 5),
(9, 1, 'SENSUAL', 5),
(10, 2, 'ULTRA', 0),
(11, 2, 'EXTASY', 5),
(12, 2, 'XXL', 5),
(13, 2, 'KPT', 5),
(14, 2, 'ORANGE', 5),
(15, 2, 'STRAWBERRY', 5),
(16, 2, 'PERFORM', 5),
(17, 2, 'INTENSE', 5),
(18, 2, 'SENSUAL', 5) 
)as cp(Id,VendorTradingId,ProductName,ProductQuantity)
)

select VI.Name, Cp.ProductName
FROM VendorInfo VI 
inner join VendorTrading VT 
on VI.Id = VT.VendorId 
inner join CustomerProducts CP 
on VT.Id = CP.VendorTradingId
GROUP BY VI.Name, CP.ProductName
HAVING  SUM( CP.ProductQuantity ) = 0

结果是:

Name       ProductName
---------- -----------
Yousuf M/s ULTRA

(1 row(s) affected)

因此,在其他日期,ULTRA的字符串可能会多于ProductQuantity

答案 2 :(得分:0)

感谢每一位人的努力,我终于这样做了。

select  Count(*) From 
(select distinct VI.Name, Cp.ProductName
FROM VendorInfo VI inner join VendorTrading VT on VI.Id = VT.VendorId inner join CustomerProducts CP on VT.Id = CP.VendorTradingId
Where VT.Tradedate = '2015-12-25' and CP.ProductName = 'ULTRA'
GROUP BY VI.Name, Cp.ProductName, CP.ProductQuantity
HAVING  COUNT( CP.ProductQuantity ) = 0) as x

但是这是另一个问题,我将其作为新问题发布。见here。感谢