2015-09-04 13 views
0

我需要獲取每個商店中每個產品的最新銷售情況,以瞭解我正在構建的報告。SQL Server:獲取所有項目/商店組的最新購買數據

我可以通過運行一個查詢,如

select top 1 
    Purchases.ArticleID, Document.StoreID, Purchases.Cost, Document.Date 
from 
    Purchases 
join 
    Document on Purchases.DocumentID = Document.DocumentID 
where 
    ArticleID = 'xxxx' and StoreID=#### 
order by 
    Document.Date 

但這樣做將意味着運行超過10萬個人查詢,這是一場災難得到一個單行的信息。

此外,查詢實際上更復雜,因爲稅務信息存儲在許多其他表中,所以實際查詢是CASE-WHEN算術的混亂並且與至少4個其他表連接。

每筆採購都使用唯一標識符記錄在採購表中:DocumentIDDocument表保存每筆交易的日期(不僅僅是購買)和指向我需要的其他表的鏈接。

我想用一個子查詢來限制DocumentIDs的池,以便查詢將只爲DocumentID的,這對應於最新的採購每個項目的每個商店運行:

where Purchases.DocumentID in 
     (select max(Purchases.DocumentID) as DocumentID 
     from Purchases 
     join Document on Purchases.DocumentID = Document.DocumentID 
     group by StoreID, ArticleID) 

但是 - 當子查詢單獨每個商店ID和每個商品ID(總共7個)只返回一個DocumentID,我只測試了一個ArticleID,主查詢返回了22行。更糟糕的是,我發現單個DocumentID可以在Purchases表中有多個行(我沒有做到這一點 - 我認爲他們這樣做是爲了促銷和其他的東西;像「買2送1」一樣) S)。

基本上,我需要的是一種方法來告訴查詢使用來自每個item-store分組的購物表中的一行的數據。

是一個子查詢的路要走,我應該專注於找出額外的行來自哪裏或有更好的方法嗎?

實際查詢長度爲16行,使用西班牙語,但如果有幫助,我會發布它。

回答

0

像這樣的東西應該適合你。

with MyValues as 
(
    select P.ArticleID 
     , D.StoreID 
     , P.Cost 
     , D.Date as DocDate 
     , ROW_NUMBER() over (Partition by Document.StoreID, Purchases.Cost order by D.Date) as RowNum 
    from Purchases P 
    join Document D on P.DocumentID = D.DocumentID 
) 
select ArticleID 
    , StoreID 
    , Cost 
    , DocDate 
from MyValues 
where RowNum = 1 
+0

它返回只有3行(而不是7應該)和兩行是同一家商店(有不同的成本和DocDates) – ConnorU

+0

@ConnorU我所提出的解決方案是在黑暗中拍攝。如果你能提供一些細節,我們可以做到這一點。對上述查詢的輕微修改應該適用於您。我只是不知道你在做什麼或者你的表和數據是什麼樣的。如果你可以發佈一個sqlfiddle這將是非常有益的。 –

+0

我設法解決了這個問題 - 我決定使用連接而不是「in」,因爲還有其他變量需要考慮,並且連接能夠爲我解決問題。謝謝你的提議! – ConnorU

相關問題