Crystal reports 逐月数据比较

Crystal reports 逐月数据比较,crystal-reports,crystal-reports-2008,Crystal Reports,Crystal Reports 2008,我试图在Crystal Reports中使用以下数据创建一个公式,该公式将计算当前RunDt中加载的DX减去前一个月两个数据源的RunDt之差。每个月将填充一个新的RunDt。刷新报告时,我需要使用最新的RunDt计算公式,并将其与每个数据源的前一个RunDt进行比较 例如,我想计算1203 RunDt的5491932减去1202 RunDt的3830842。然后让公式为可能填充的每个数据源执行此操作。同样的数据源也将有2012年的服务年,并且希望2011年与2011年相比,2012年与2012

我试图在Crystal Reports中使用以下数据创建一个公式,该公式将计算当前RunDt中加载的DX减去前一个月两个数据源的RunDt之差。每个月将填充一个新的RunDt。刷新报告时,我需要使用最新的RunDt计算公式,并将其与每个数据源的前一个RunDt进行比较

例如,我想计算1203 RunDt的5491932减去1202 RunDt的3830842。然后让公式为可能填充的每个数据源执行此操作。同样的数据源也将有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  
非常感谢任何建议的帮助


谢谢大家!

这类问题很容易陷入困境。诀窍是通过使用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

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

按照要求的顺序对数据集进行显式排序,即Yr升序、数据源升序、RunDt_YYMM降序。应该可以在查询或Crystal Record Sort expert中执行此操作。 输入如下公式以匹配表名: 将新公式从“字段管理器”拖放到“报告详细信息”区域中DxLoaded字段旁边。
请将你建立的每一个公式的文本发布出来。谢谢你,马克,你的建议奏效了。我唯一的另一个问题是,如果我只想显示最新的RunDt_YYMM怎么办?当我试图在报告中仅显示1203时,公式变成了零。当上一个RunDt未显示在报表本身上时,是否仍有公式函数?我碰巧做了一个记录选择公式,{HNT_End_to_End_Data.REPT_YYMM}=cStrcurrentdate,'YYMM',此时值变为零。当只显示当前RunDt时,我需要尝试实现这一点。您需要执行:{HNT_End_to_End_Data.REPT_YYMM}=cStrcurrentdate、'YYMM'或{HNT_End_to_End_Data.REPT_YYMM}=cStrdateadd'm',1,currentdate,'YYMM',如果您在细节部分显示字段,则需要使用{HNT_End_To_End_Data.REPT_YYMM}cStrcurrentdate,'yyMM'-尽管我显然还是更喜欢我的方法:@LaTrishaRoman:正如Lee所解释的,你需要同时选择当前和以前的yyMM,然后抑制以前的yyMM的输出-Crystal只能对它检索到的数据执行计算。非常感谢各位!!我可以根据你的建议做我需要做的事情手势。=最后一件事。我如何总结结果。它不允许我在公式中插入摘要、进行汇总或求和。此时是否需要单独的公式?@LaTrishaRoman:是-假设您的差异公式被称为RunDateDifference,则创建一个新公式作为global numberVar SDD:=SDD+{@RunDateDifference}然后将新公式放入“详细信息”部分和“报表页脚”部分。您可能希望在“详细信息”部分中取消显示该公式。
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})