Проценты матрицы SSRS

Вот отчет: таблица отчетов

Вот как я получил проценты для столбца «% изменений за последний год».

=((Last(Fields!Quantity.Value,"Child")  -  First(Fields!Quantity.Value)) / First(Fields!Quantity.Value))`

= ((54675 - 55968)/55968 ) = -2.31%'
= ((54675 - 57849)/57849)  = -5.49%'

В этом случае всегда будет браться первый год «2012» и получать проценты по отношению друг к другу. Если я введу 2005,2004,2003,2002,2001 годы, он всегда будет брать первый год и делать проценты по отношению к каждому дополнительному году. 2005-2004, 2005-2003, 2005-2002 и так далее. У меня может быть до 2 столбцов (год) для многих столбцов.

Мне нужно сделать это для итогов и промежуточных сумм, но это не сработает, потому что это другая область.

data is     = row Child group
Sub Total:  = row Parent group
Total:      = row Total group
Year        = Column Period group

Использование запроса для получения результата.

 SELECT     MEMBERSHIP_CODE
, PERIOD, COUNT(DISTINCT ID) AS Distinct_ID
, SUM(QUANTITY) AS Quantity
, '01-Personal' AS Child
, '01-Overall' AS Parent
, 'Total' as Total
  FROM         vf_Sshot AS vfs
INNER JOIN vProd AS vP ON vfs.PRODUCT_CODE = vP.PRODUCT_CODE
INNER JOIN vMem_Type vMT on vMT.Member_Type = vfs.Member_Type
  WHERE  (PERIOD IN ( (SELECT Val from dbo.fn_String_To_Table(@Periods,',',1))))                  
      AND (vMT.MEMBER_TYPE NOT IN ('a','b','c')) 
      AND (vfs.STATUS IN ( 'A', 'D', 'C')) 
      AND (MEMBERSHIP_CODE NOT IN ('ABC', 'DEF' ))
      and vP.PROD_TYPE in ('DUE','MC','SC')
  and vMT.Member_Record = '1'
 GROUP BY MEMBERSHIP_CODE, PERIOD

Любые идеи?

Как бы я произвел этот вывод?

ИТОГО: 57 573 58 941 57 573 61 188 57 573 61 175 57 175

введите здесь описание изображения


person J D    schedule 12.10.2012    source источник
comment
Можете ли вы внести изменения в запрос, который создает ваш набор данных?   -  person Joao Leal    schedule 16.10.2012
comment
Да, но я предпочитаю этого не делать. Этот запрос является лишь частью группы союзов. Разница в союзе - это Дочерний, Родительский и Итоговый. Спасибо!   -  person J D    schedule 16.10.2012
comment
Кто угодно???????????????????????????????????????   -  person J D    schedule 18.10.2012
comment
В последней версии ssrs есть решение для этого: docs.microsoft.com/en-us/sql/reporting-services/report-design/   -  person RGME    schedule 16.04.2020


Ответы (1)


Это самый простой способ решить вашу проблему. В своем запросе укажите сумму за последний период в отдельном столбце (вы можете преобразовать свой запрос в CTE, чтобы вам не пришлось сильно менять базовый запрос):

WITH query AS (
   SELECT     MEMBERSHIP_CODE
     , PERIOD, COUNT(DISTINCT ID) AS Distinct_ID
     , SUM(QUANTITY) AS Quantity
     , '01-Personal' AS Child
     , '01-Overall' AS Parent
     , 'Total' as Total
  ...
UNION
   SELECT
  ...
)
SELECT
   A.MEMBERSHIP_CODE,
   A.PERIOD,
   A.Distinct_ID,
   A.Child,
   A.Parent,
   A.Total,
   A.Quantity,
   B.Quantity AS LastPeriodQuantity
FROM
   query A INNER JOIN
(SELECT *, ROW_NUMBER() OVER(PARTITION BY MEMBERSHIP_CODE, Distinct_ID, Child, Parent ORDER BY PERIOD DESC) as periodOrder FROM query) B ON
A.MEMBERSHIP_CODE = B.MEMBERSHIP_CODE AND
A.DISTINCT_ID = B.DISTINCT_ID AND
A.Parent = B.Parent AND
A.Child = B.Child AND
A.Total = B.Total AND
B.PeriodOrder = 1

И затем во всех ваших итогах/промежуточных итогах/столбцах вы будете получать доступ к столбцу, который группируется/фильтруется по тем же правилам, что и ваш знаменатель. Ваше выражение может оставаться для всех ячеек примерно таким: =(Fields!LastPeriodQuantity.Value - Fields!Quantity.Value) / Fields!Quantity.Value

person Joao Leal    schedule 19.10.2012
comment
Я действительно предпочел бы сделать это в SSRS, а не в запросе. Спасибо! - person J D; 22.10.2012