Crystal Reports或T-SQL:根据另一个表中的值比较多个记录值

时间:2014-05-30 01:59:16

标签: sql-server tsql crystal-reports

我正在尝试比较然后对Crystal Reports或T-SQL(MS SQL Server)中具有多个条目的值集进行计算,然后进行计算。

示例数据:

表A(数百万行)

Entry ID 1, Vendor, Product ID, Inventory Count, Inventory Value

Entry ID 2, Vendor, Product ID, Inventory Count, Inventory Value

...

Entry ID 99, Vendor, Product ID, Inventory Count, Inventory Value

表B :(数百万行)

Entry ID 1, DateTime, EntryType

Entry ID 2, DateTime, EntryType

...

Entry ID 99, DateTime, EntryType

在每个事务实例的两个表中都创建了一个条目,并且这两个表都是500万个以上的行,以及在计划和某些维护活动中发生的多个批处理操作的条目。

我需要比较表A中的两个值,并计算库存计数和库存值的差异。库存值,但仅限于表B(最大)中的最近日期时间或条目ID更新,而不管表B条目类型和类型" 10"的最后一个表B值。对于供应商和表A中的产品ID。

如果条目1类型为' 10'那就简单条目99的类型为62,我会从条目1的值中减去条目99的值,以得出当前的库存计数和值。

这就是供应商选择在他们的软件中实现它的方式,我正在寻找一种方法来在他们的应用程序之外获取这些信息。

Crystal Report的方式是首选,但是T-SQL解决方案我可能也会为我工作,只要它返回所有产品或者不需要硬编码产品ID,默认情况下除非在WHERE语句或Crystal Reports过滤器中进一步过滤,否则返回完整的清单。

我正在使用MS SQL Server 2008 SP3运行Crystal Reports 2011

1 个答案:

答案 0 :(得分:1)

尝试使用此查询。它会在几秒钟内运行300万行随机测试数据(在您的表上拥有正确的索引将非常重要)。我称表A'库存'和表B'条目'。

select x.Vendor, x.ProductId, i2.InventoryCount - i.InventoryCount InventoryCountDiff, i2.InventoryValue - i.InventoryValue InventoryValueDiff
from
(
    select i.Vendor, i.ProductId, Max(e.EntryDate) MaxEntryDate, (select MAX(e2.EntryId) from Entry e2 join Inventory i2 on i2.EntryId = e2.EntryId and i2.Vendor = i.Vendor and i2.ProductId = i.ProductId where e2.EntryType = 10) MaxEntryId
    from Inventory i 
    join Entry e on e.EntryId = i.EntryId
    group by i.Vendor, i.ProductId
) x
join Inventory i on x.Vendor = i.Vendor and x.ProductId = i.ProductId
join Entry e on i.EntryId = e.EntryId
join Inventory i2 on x.Vendor = i2.Vendor and x.ProductId = i2.ProductId
join Entry e2 on i2.EntryId = e2.EntryId
where e.EntryDate = x.MaxEntryDate
and e2.EntryId = x.MaxEntryId

无论您最终使用哪种查询,请自己帮忙并将其放入存储过程中,然后将该过程用作报告的来源。 Crystal Reports非常痛苦,无需在设计器中编写复杂的查询。