2013-05-02 105 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