2012-03-06 2 views
0

Я пытаюсь создать формулу в Crystal Reports, используя приведенные ниже данные, которые будут вычислять разницу DxLoaded в текущем RunDt минус предыдущий месяц RunDt для каждого из двух источников данных. Каждый месяц будет заполнен новый RunDt. Когда отчет обновляется, мне нужно вычислить формулу, используя самый последний RunDt, сравнивающий его с предыдущим RunDt для каждого источника данных.Сравнение данных по месяцам

Например, я бы хотел рассчитать 5,491,932 для 1203 RunDt минус 3,830,842 для 1202 RunDt. Затем примените формулу для каждого источника данных, который может быть заполнен. Также будет год службы 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 

Любая помощь в предложениях приветствуется!

Спасибо!

+0

Пожалуйста, разместите текст каждой из формул, которые вы создали. – craig

ответ

0

Предполагая, что вы хотите, чтобы вывод появляться в порядке, указанном в вопросе, и что вы хотите, чтобы разница появляться рядом с самым последним RunDt_YYMM значения для источника данных и года:

  • Явно сортировать набор данных в требуемом порядке - т.е. Yr по возрастанию, Data_Source по возрастанию, RunDt_YYMMпо убыванию. (Это должно быть возможно сделать это либо в запросе или в асе сортировки Кристал записи.)
  • Введите формулу, как следующее (изменить соответствие с вашим именем таблицы):

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.
+0

Спасибо, Марк, ваше предложение сработало. Единственный другой вопрос, который у меня есть, - это то, что если я хочу показывать только самый текущий RunDt_YYMM? Когда я попытался отобразить только 1203 в отчете, формула превратилась в нули. Любой способ иметь формулу, когда предыдущий RunDt не отображается в самом отчете? Мне случается сделать формулу выбора записей, {HNT_End_To_End_Data.REPT_YYMM} = cStr (currentdate, 'yyMM'), и именно тогда значения обратились в ноль. Мне нужно будет попытаться сделать эту работу, только показывая текущий RunDt. – Trish

+0

Вам нужно будет: '{HNT_End_To_End_Data.REPT_YYMM} = cStr (currentdate, 'yyMM') или {HNT_End_To_End_Data.REPT_YYMM} = cStr (dateadd ('m', - 1, currentdate), 'yyMM')' then if вы показываете свои поля в разделе подробностей, вам нужно будет условно подавить раздел, используя '{HNT_End_To_End_Data.REPT_YYMM} <> cStr (currentdate, 'yyMM') '- хотя, очевидно, я все же предпочитаю свой подход :) –

+0

@LaTrishaRoman: Как объяснил Ли, вам нужно будет выбрать как текущий, так и предыдущий YYMM, а затем подавить вывод из предыдущего YYMM - Crystal может выполнять вычисления только по полученным данным. –

0

Это очень легко увязнуть с такой проблемой. Хитрость состоит в том, чтобы отсортировать данные в запросе, присоединив таблицу к себе, используя столбец rundt. Вы можете либо сделать это в кристалле, используя пользовательскую команду, либо то, что я предпочитаю делать, это создать представление или хранимую процедуру в 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 
Смежные вопросы