2013-05-02 161 views
0

我在ASP.NET MVC4項目(使用Visual Studio 2010)中使用Reporting Service來生成報告,並使用存儲過程。我有一張桌子產品它可以屬於人。這就是分配的概念。產品可以被分配給不同的人(多到許多關係),我有這兩個之間的中間表:SQL - 使用報告服務進行報告的存儲過程

Allocations tables

我想TOT我的報告做的事情是,以顯示相關信息包括所有者在內的每個現有產品。在這種情況下,我可以有兩種類型的所有者:公司(因此產品從未分配過最後分配有一個EndDate)或一個人(因此最後一次分配沒有EndDate或有一個「未來」EndDate)。

我知道所有這些驗證應該在我的報告模板中進行,但對於SQL存儲過程,我不知道如何進行每個產品的最後分配(如果有的話)。

任何想法可以幫助歡迎。

編輯:更新查詢

SELECT pr.SerialNumber, coalesce (p.LastName, 'US') as Owner 
FROM bm_Products pr 
LEFT OUTER JOIN 
    (Select Id_Person, Id_Product, max(ISNULL(EndDate,getdate()+1)) as MaxAllocDate 
    FROM bm_ProductAllocations a 
    WHERE EndDate > getdate() 
    group by Id_Person, Id_Product 
    having max(ISNULL(EndDate, getdate()+1)) = 
     (select max(isnull(EndDate, getdate()+1)) 
     from bm_ProductAllocations where Id_Product = a.Id_Product) 
    ) pa on pr.Id_Product = pa.Id_Product 
LEFT OUTER JOIN bm_Persons p on pa.Id_Person = p.Id_Person 

結果:

SerialNumber          Owner            
-------------------------------------------------- -------------------------------------------------- 
78745148154815204         US             
84512048150410522         US             
84512841520415205         US             
87451284512485120         US             
56123051215215215         US             
48512485487487856         US             
CNU1510ZL0           US             
8456656551521          US             
4154854854151          US             
4851205230047          US             
4511120521050          US             
84515151320541201         US             
74161230326524165         US 

回答

0

我沒有看到「公司」爲顯示在表的所有者,所以我現在假設它是在產品表中,因爲您擁有硬編碼的「美國」,或者您可以提供更新。

SELECT pr.Product, coalesce (p.person, 'US') as Owner 
FROM Product pr 
LEFT OUTER JOIN 
    (Select id_person, id_product, max(ISNULL(EndDate,getdate()+1)) as MaxAllocDate 
    FROM Product_Allocation a 
    WHERE Enddate > getdate() 
    group by id_person, id_product 
    having max(ISNULL(EndDate, getdate()+1)) = 
     (select max(isnull(Enddate, getdate()+1)) 
     from product_allocation where id_product = a.id_Product) 
    ) pa on pr.id_product = pa.id_product 
LEFT OUTER JOIN person p on pa.id_person = p.id_person 

子查詢將按產品和人給你最大結束日期。因爲我們需要子查詢來返回人員,所以如果您有多個未到期的分配,您可能會爲每個產品獲取多個id_person記錄。 「having」子句將使用已經彙總的結束日期來匹配沒有該人的產品的最大結束日期,因此您將只獲得「最未來」分配結束日期。由於產品分配與人員結合,並且他們留在產品表中,如果沒有未分配或未來分配,或根本沒有分配,那麼您將獲得'美國'作爲您的所有者。如果您的「公司」位於其他地方,則可以直接從產品中添加另一個表格,並將其替換爲「美國」。

我沒有一個數據集來處理這個問題,所以我不能測試它,但我測試了這個過程並且它的功能正確。

如果還有其他假設,例如,一次只有一個分配等,這可以被簡化。你也可以通過一個內存表來處理這個問題,只有當前和未來的產品分配,但我相信這應該起作用。如果您只在日期時間工作,則可能需要調整「getdate()」。如果是這種情況,那麼使用cast(convert(varchar(10),getdate(),101)作爲日期時間),並只返回getdate函數的日期部分。

希望這可以幫助你

+0

感謝您的幫助。事實上,在我的數據庫中,我所有的表都以「bm_」開頭,因此我試圖根據需要調整查詢。無論如何,當我想測試執行它時,我遇到了一個錯誤:沒有爲'pa'的列3指定列名。你有好主意嗎?再次感謝 ! – Traffy 2013-05-03 07:17:39

+0

子查詢必須具有所有字段的字段名稱。我忘記了最大分配日期的別名。上面編輯。讓我知道這是如何解決的 – 2013-05-03 17:03:35

+0

感謝您的修改,現在查詢可以毫無問題地執行。無論如何,對於我所有的產品,我得到「美國」作爲所有者,這意味着該產品沒有分配或最後的分配已完成...編輯以讓您知道我有什麼。再次感謝 ! – Traffy 2013-05-04 08:17:20