2016-02-28 104 views
0

我試圖獲取產品數量(SUM)等於零的所有供應商。這是我迄今爲止所做的,但它不會返回任何行,也不會產生任何錯誤。我確保有數量爲零的產品,並且腳本在正確的數據庫上運行。HAVING與WHERE之間的混淆,SQL Server

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感到困惑。我該怎麼辦?

UPDATE:

這是VendorInfo表:

enter image description here

這是VendorTrading表:

enter image description here

這是CustomerProduct表:

enter image description here

現在預期的結果的結果應該是這樣的:

enter image description here

會有同樣的產品,但具有不同Tradedate多行,所以應該首先SUM所有產品的數量,如果它等於零,則它返回VendorName和產品名稱,它在某個時間段內有0個產品數量。後來我還需要它的產品數量爲0 希望它會清除所有

+2

你應該提供樣本數據和期望的結果(也許是一個SQL小提琴)。您的描述聽起來好像沒有供應商/產品組合符合條件;這似乎完全合理。 –

+3

您的**標題**和**解釋**不相關 –

+0

@MotoGP您能推薦一個標題嗎? –

回答

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子句是正確的。

+0

不,如果產品數量爲0,則不需要在交易平臺上有行。一筆交易將包含許多產品。其中一些可能包含一些數量可能等於0. –

+0

感謝您迄今爲止的努力@Hellmar Becker。我試過了你的查詢但它不返回任何東西 –

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

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。謝謝

+0

這個查詢返回一個簡單的數字,而你的查詢在問題中返回一個供應商名稱列表。因此,此查詢似乎不是您所問的問題的答案。這裏真正的解決方案是子查詢別名爲'x'嗎?如果是這樣,你應該編輯你的答案,並將其標記爲正確的答案。 –