0

我在 ASP.NET MVC4 项目(使用 Visual Studio 2010)中使用 Reporting Service 来生成报告,并且我正在使用存储过程。我有一个可以属于人的表产品。这就是分配的概念。一个产品可以分配给不同的人(多对多关系),我在这两者之间有一个中间表:

分配表

我想要在报告中做的事情是显示与每个现有产品相关的信息,包括所有者。在这种情况下,我可以有两种所有者:公司(因此从未分配过产品或最后一次分配有 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
4

1 回答 1

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 记录。“have”子句将使用已经汇总的结束日期来匹配没有人员的产品的最大结束日期,因此您将只获得“最未来”的分配结束日期。由于产品分配已连接到人员,并且它们被连接到产品表,如果没有未过期或未来的分配,或者根本没有分配,那么您将获得“美国”作为您的所有者。如果您的“公司”在其他地方,您总是可以直接从产品中添加另一个表连接,并将其替换为“美国”。

我没有一个数据集可以完全复制它,所以我无法测试它,但我确实测试了拥有过程并且它运行正常。

如果有其他假设,例如一次只分配一个等,则可以简化。您也可以通过仅包含当前和未来产品分配的内存表来解决此问题,但我相信这应该可行。如果您只是在工作日期而不是日期时间,则可能需要调整“getdate()”。如果是这种情况,则使用 cast(convert(varchar(10), getdate(), 101) as datetime) 并仅返回 getdate 函数的日期部分。

希望这可以帮助你

于 2013-05-02T19:49:15.307 回答