2013-03-08 33 views
0

我試圖返回銷售特定產品(SourceCustomerProductCode = 102)的帳戶的列表,並且希望查看2013年銷售此產品的帳戶,但是如果他們在2012年銷售它,我希望它們排除在我的查詢之外(即我只想返回新客戶)。我下面的查詢返回了出售該產品在2013年賬戶,但包括出售它在2012年如果在特定時間段內有值,則排除項目

賬戶,我知道我可以爲[CaseAndGalloneVolume]語句時使用的情況下,在選擇區域下寫這篇文章,但需要在where子句中寫下這個語句,因爲最終我會將其他產品添加到我的表中。

感謝您的幫助!

SELECT 

sum([FactActualDetail].[CaseAndGallonVolume]) AS [CaseAndGallonVolume], 
sum([FactActualDetail].[AdjGrossMarginAmount]) AS [AdjGrossMarginAmount], 
left([FactActualDetail].[SourceCustomerProductCode],7) as [Acct #] 

FROM [dbo].[FactActualDetail] [FactActualDetail] 

LEFT JOIN [dbo].[DimCustomer] [DimCustomer] ON ([FactActualDetail].[CustomerSK] [DimCustomer].[CustomerSK]) 
LEFT JOIN [Common].[DimDate] [DimDate] ON ([FactActualDetail].[DeliveryDateSK] = [DimDate].[DateSK]) 

WHERE [Fiscal_Year] = 2013 AND [EQMultiplier] > 0 AND ([SuperChannelCode] = 04 OR [SuperChannelCode] = 06 OR [SuperChannelCode] = 07) AND (substring([SourceCustomerProductCode],8,3) = 102) 

GROUP BY left([FactActualDetail].[SourceCustomerProductCode],7) 
+0

Amik的答案作品,但如果我在SELECT下添加[Fiscal_Month]或[Fiscal_Year](來自另一個表DimDate),他的答案不起作用。它們從過去幾年的音量中抽身而出。 – Dale 2013-03-08 18:15:05

+0

因爲您需要添加WHERE [Fiscal_Year] IN(2013,2012),然後檢查HAVING MIN([Fiscal_Year])= 2013的條件。 – 2013-03-08 21:44:46

回答

1

試着將

HAVING MIN([Fiscal_Year]) = 2013 

在查詢結束。

+0

是的。我必須刪除我的Where子句中的Fiscal_Year才能使其工作。不要讓事情變得更棘手,但如果我想向我的SQL添加另一種產品,比方說產品111,但是我想包含2012年以及2013年的數量,我需要一個子查詢? – Dale 2013-03-08 17:04:28

+0

不確定你的意思。 HAVING子句將在GROUP BY之後進行處理,並在2012年將所有分組的行與某些產品進行處理,因此只會顯示2013年所有產品(2012年均無)的客戶。如果你在2012年爲某人分配產品,是的,他不會被這個查詢返回,你必須做出另一個解決方法(首先明確如何定義客戶想要返回的查詢) – amik 2013-03-08 17:15:15

+0

@Dale:如果這額外的問題對選擇正確的數據過濾方法至關重要,您應該將其添加到您的主文章中。 – 2013-03-08 17:51:53

0

添加一個新的聚合列:它

sum(case when year = 2013 then 1 else 0 end) as invalidItemCount 

和過濾:

having invalidItemCount = 0 

這適用於任意篩選表達式,不只是僅僅的2013年

相關問題