Crystal reports 逐月数据比较
我试图在Crystal Reports中使用以下数据创建一个公式,该公式将计算当前RunDt中加载的DX减去前一个月两个数据源的RunDt之差。每个月将填充一个新的RunDt。刷新报告时,我需要使用最新的RunDt计算公式,并将其与每个数据源的前一个RunDt进行比较 例如,我想计算1203 RunDt的5491932减去1202 RunDt的3830842。然后让公式为可能填充的每个数据源执行此操作。同样的数据源也将有2012年的服务年,并且希望2011年与2011年相比,2012年与2012年相比。我尝试过使用前面的函数,但没有获得正确的结果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
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})