我正在尝试获取其产品数量(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
我对HAVING
和WHERE
感到困惑。我该怎么办?
更新
这是VendorInfo
表:
这是VendorTrading
表:
这是CustomerProduct
表:
现在预期的结果应该是:
将有多行相同的产品但具有不同的Tradedate,因此它应首先SUM所有产品数量,如果它等于零,则返回VendorName和Product name,它在某段时间内具有0产品数量。之后我还需要产品数量为0的供应商总数。 希望它能清除一切
答案 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。感谢