繁体   English   中英

SQL-使用Reporting Service进行报告的存储过程

[英]SQL - Stored Procedures for reporting using Reporting Service

我正在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

在所示的表格上,我没有看到所有者的“公司”,因此,我现在假设它在产品表中,因为您拥有它,所以使用了硬编码的“ US”,或者可以提供更新。

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记录。 “具有”子句将使用已经汇总的结束日期来匹配不带人员的产品的最大结束日期,因此您将仅获得“最未来的”分配结束日期。 由于产品分配是与该人联系在一起的,因此他们仍然与产品表联系在一起,因此,如果没有未到期的或将来的分配,或者根本没有任何分配,那么您将获得“美国”作为所有者。 如果您的“公司”在其他地方,您总是可以直接从产品中直接添加另一个表联接,并用“美国”代替。

我没有要处理的数据集可以完全复制它,因此我无法对其进行测试,但是我确实测试了具有过程并正常运行。

如果还有其他假设,例如一次只能分配一个,等等,则可以简化这一过程。 您也可以通过一个内存表来处理此问题,该内存表仅按产品列出当前和将来的分配,但是我认为这应该可行。 如果您只是在休假而不是日期时间,则可能需要调整“ getdate()”。 如果是这种情况,请使用cast(convert(varchar(10),getdate(),101)作为datetime)并仅返回getdate函数的日期部分。

希望这可以帮助你

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM