每月数据比较

时间:2012-03-06 22:09:31

标签: crystal-reports crystal-reports-2008

我正在尝试使用以下数据在Crystal Reports中创建一个公式,该数据将计算当前RunDt中DxLoaded的差异减去两个数据源中每个数据源的上个月RunDt。每个月都会填充一个新的RunDt。刷新报表时,我需要使用最新的RunDt计算公式,将其与每个数据源的先前RunDt进行比较。

例如,我想计算1203 RunDt的5,491,932减去1202 RunDt的3,830,842。然后让公式为可能填充的每个数据源执行该操作。对于相同的数据源,2012年也将有服务年度,并希望2011年与2011年和2012年相比仅与2012年相比。我尝试使用之前的功能,但没有幸运获得正确的结果。

Yr             Data_Source  RunDt_YYMM      DxLoaded   
2011           ABS          1203            5,491,932  
2011           ABS          1202            3,830,842  
2011           IALT         1203            9,193,144  
2011           IALT         1202            6,578,678  
2012           ABS          1203            1,837,900  
2012           ABS          1202            1,083,124  
2012           IALT         1203            4,223,111  
2012           IALT         1202            2,985,543  

非常感谢任何建议的帮助!!

谢谢!

2 个答案:

答案 0 :(得分:0)

这种问题很容易陷入困境。诀窍是通过使用rundt列将表连接到自身来对查询中的数据进行排序。您可以使用自定义命令在Crystal中执行此操作,或者我更喜欢在SQL中创建视图或存储过程。例如:

SELECT *
INTO #TEMP
FROM ( 
SELECT 2011 Yr, 'ABS' Data_Source, '1203' RunDt_YYMM, 5491932 DxLoaded
UNION SELECT 2011 Yr, 'ABS' Data_Source, '1202' RunDt_YYMM, 3830842 DxLoaded
UNION SELECT 2011 Yr, 'IALT' Data_Source, '1203' RunDt_YYMM, 9193144 DxLoaded
UNION SELECT 2011 Yr, 'IALT' Data_Source, '1202' RunDt_YYMM, 6578678 DxLoaded
UNION SELECT 2012 Yr, 'ABS' Data_Source, '1203' RunDt_YYMM, 1837900 DxLoaded
UNION SELECT 2012 Yr, 'ABS' Data_Source, '1202' RunDt_YYMM, 1083124 DxLoaded
UNION SELECT 2012 Yr, 'IALT' Data_Source, '1203' RunDt_YYMM, 4223111 DxLoaded
UNION SELECT 2012 Yr, 'IALT' Data_Source, '1202' RunDt_YYMM, 2985543 DxLoaded
) A

SELECT * FROM #TEMP

SELECT 
 a.Yr, a.Data_Source, a.RunDT_YYMM, a.DxLoaded, b.DxLoaded PrevDxLoaded
FROM 
 #TEMP a
LEFT OUTER JOIN 
 #TEMP b
ON 
 b.Yr = a.Yr 
AND 
 b.Data_Source = a.Data_Source 
AND 
 b.RunDT_YYMM = CASE WHEN RIGHT(a.RunDT_YYMM,2) = '01' THEN  
  CAST(CAST(a.RunDT_YYMM as INT) - 89 AS VARCHAR(4))
 ELSE 
  CAST(CAST(a.RunDT_YYMM as INT) - 1 AS VARCHAR(4))
 END

结果:

Yr      Data_Source   RunDT_YYMM DxLoaded   PrevDxLoaded
2011    ABS           1202       3830842    NULL
2011    ABS           1203       5491932    3830842
2011    IALT          1202       6578678    NULL
2011    IALT          1203       9193144    6578678
2012    ABS           1202       1083124    NULL
2012    ABS           1203       1837900    1083124
2012    IALT          1202       2985543    NULL
2012    IALT          1203       4223111    2985543

答案 1 :(得分:0)

假设您希望输出按问题中给出的顺序显示,并且您希望差异显示在数据源和年份的最新RunDt_YYMM值旁边:

  • 按所需顺序显式排序数据集 - 即。 Yr升序,Data_Source升序,RunDt_YYMM 降序。 (应该可以在查询中或在Crystal Record排序专家中执行此操作。)
  • 输入如下公式(修改以匹配您的表名):

if NextIsNull ({SummaryTable.Yr}) then 0 else
if {SummaryTable.Data_Source}=Next({SummaryTable.Data_Source}) and
   {SummaryTable.Yr}=Next({SummaryTable.Yr})
then {SummaryTable.DxLoaded} - Next({SummaryTable.DxLoaded})
  • 将新公式从字段资源管理器拖放到DxLoaded字段旁边的报告详细信息部分。