Какие еще выражения я могу использовать, чтобы попытаться рассчитать среднесуточную сумму в отчете SSRS

#reporting-services #expression #average

#службы отчетов #выражение #среднее

Вопрос:

Я создаю отчет с 2 матричными таблицами с разными (но очень похожими) наборами данных. Мне нужно рассчитать среднесуточную сумму транзакции, в которой пользователь вводит месяц и год, которые они хотят видеть. Я смог использовать следующее выражение в первой таблице без проблем.

 =sum(fields!tot_rev.Value)/fields!Day.Value
  

Где «День» — это день месяца. Я использовал «День (trn_dt) как день» в своем запросе, чтобы извлечь день из строки даты и времени.

Я попытался использовать то же выражение во второй таблице, но оно возвращает только общую сумму. Если я использую

=sum(fields!amt.Value)/countdistinct(fields!Day.Value)

он возвращает значение, которое кажется случайным (я не знаю, как оно пришло к этому значению при каких-либо вычислениях)

Единственный способ, которым я смог успешно получить среднее значение, — это ввести количество дней в выражении.

 =sum(fields!amt.Value)/22
  

Но мне это нужно для работы с параметрами, и количество дней не будет постоянным.

Вот пример моих данных из dataset1:

 SELECT        MONTH(inv_dt) AS Month, DAY(inv_dt) AS Day, YEAR(inv_dt) AS Year, bill_by, inv_no, tot_rev
FROM            inv_info
WHERE        (status_cd IN ('FF', 'FP')) AND (MONTH(inv_dt) = @Month) AND (YEAR(inv_dt) = @Year)
 
  

Месяц, день, год, bill_by, inv_no, tot_rev

10, 23, 2020, ERSA, 40444, 4881

10, 23, 2020, ERSA, 40443, 2043

10, 22, 2020, DYCO, 40435, 2504

10, 22, 2020, ERSA, 40431, 20524

Вот пример из dataset2 (таблица с проблемой):

 SELECT        YEAR(trn_info.trn_dt) AS YEAR, MONTH(trn_info.trn_dt) AS MONTH, DAY(trn_info.trn_dt) AS Day, trn_info.reg_no, trn_dtail.amt, trn_info.acc_by
FROM            trn_info LEFT OUTER JOIN
                         trn_dtail ON trn_info.trn_no = trn_dtail.trn_no
WHERE        (trn_info.status IN ('FP', 'FF')) AND (trn_info.tpe_cd IN ('AI', 'BI')) AND (trn_dtail.rte_cd = 'TT') AND (MONTH(trn_info.trn_dt) = @Month) AND (YEAR(trn_info.trn_dt) = @Year)
  

Год, месяц, день, reg_no, amt, acc_by

2020, 10, 1, 40113, 377.96, JLMA

2020, 10, 1, 40115, 6637.07, НАЗО

2020, 10, 2, 40104, 790, МАКГО

2020, 10, 2, 40106, 1406.25, МАКГО

2020, 10, 3, 40100, 239.77, JEDX

На прикрепленном рисунке выражение в верхнем левом углу: =MonthName(Fields!MONTH.Value,false)

День месяца указан слева с общим количеством (количество транзакций) и суммой для каждого процессора (acc_by / bill_by) в поле данных.

Я использовал =iif(isnothing(Sum(Fields!amt.Value)), 0, sum(fields!amt.Value)) в качестве выражения для поля amt.

Общее количество столбцов — это общее количество и сумма за этот день от всех процессоров.

Общая сумма строк — это среднее ежедневное количество и среднесуточный amt по процессору, а там, где пересекаются столбец total и строка total, это среднее ежедневное количество за месяц, и я хотел бы также показать среднесуточный amt транзакций за месяц, но это то, что не работает должным образом.

Смотрите прикрепленное изображение:

изображение таблицы 2

Кто-нибудь знает, что еще я могу попробовать?

Комментарии:

1. Вы редактируете свой вопрос и добавляете выборку данных из каждого набора данных, включая типы данных, вместе с ожидаемыми результатами на основе этих выборочных данных. Если в вашем отчете есть какая-либо группировка, покажите скриншот вашего отчета, включая любые группы строк или столбцов, поскольку это может повлиять на ответ.

2. Дайте мне знать, если вы хотите, чтобы я уточнил что-нибудь еще.

Ответ №1:

Не разбивайте дату на составные части, пока вы ее не представите, и даже тогда используйте форматирование для отображения части даты без преобразования даты в целые числа или строки. Таким образом появляется так много ошибок в вычислениях.

Оставьте inv_dt и trn_dt в качестве значений даты и времени в вашем запросе и таким образом внесите их в SSRS. В SSRS используйте значения форматирования даты, чтобы отображать только год или месяц.

Чтобы рассчитать среднесуточную сумму, создайте группировку в отчете SSRS по дате. Выберите понятное название группы, например InvoiceDate или что-то в этом роде. Затем используйте Avg(fields!amt.value,"InvoiceDate") . Это подскажет SSRS усреднять сумму внутри группировки (каждый день). При желании вы можете усреднить среднее значение на Avg(Avg(fields!amt.value,"InvoiceDate")) .

Пожалуйста, найдите время, чтобы узнать, как управлять датами в SQL и SSRS. Результаты вашего запроса будут более точными, и ваши коллеги будут благодарны вам за поддержку вашего кода.

В качестве примера того, о чем я говорю, посмотрите, можете ли вы обнаружить логическую ошибку в каком-либо коде DB2, который я обновляю на этой неделе (подсказка проблема возникает в январе:

   AND Month(CUST.acct_svc_strt_d) >= (Month(CURRENT DATE) - 1)
  AND Year(CUST.acct_svc_strt_d) = Year(CURRENT DATE)