2016-10-06 2 views
0

В моем отчете SSRS есть две группы (учетная запись, месяц). Учетная запись «Родитель» и «Месяц» - это дочерняя группа. Теперь я хочу показать конечный баланс каждого месяца как начальный баланс следующего месяца. Ниже приведен пример отчета. Красный шрифт указывает SUM каждой группы. Помните, что я пытаюсь получить результат, используя функцию SSRS Previous(), но не могу получить ожидаемый результат.Как получить предыдущее значение строки в SSRS

Previous(Sum(Fields!NetAmt.Value),"Month") 

месяц => название группы месяцев.

Может ли кто-нибудь мне помочь?

Заранее спасибо.

Rashed

Образец данных SQL

CREATE TABLE [dbo].[Balances](
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [Account] [nvarchar](50) NULL, 
    [Month] [date] NULL, 
    [BegBalance] [float] NULL, 
    [Debit] [float] NULL, 
    [Credit] [float] NULL, 
    [EndBalance] [float] NULL, 
CONSTRAINT [PK_Balances] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
SET IDENTITY_INSERT [dbo].[Balances] ON 
INSERT [dbo].[Balances] ([id], [Account], [Month], [BegBalance], [Debit], [Credit], [EndBalance]) VALUES (1, N'Cash', CAST(0xDB3A0B00 AS Date), 0, 100, 50, 50) 
INSERT [dbo].[Balances] ([id], [Account], [Month], [BegBalance], [Debit], [Credit], [EndBalance]) VALUES (2, N'Cash', CAST(0xDB3A0B00 AS Date), 0, 200, 50, 150) 
INSERT [dbo].[Balances] ([id], [Account], [Month], [BegBalance], [Debit], [Credit], [EndBalance]) VALUES (3, N'Cash', CAST(0xFA3A0B00 AS Date), 0, 200, 50, 150) 
INSERT [dbo].[Balances] ([id], [Account], [Month], [BegBalance], [Debit], [Credit], [EndBalance]) VALUES (4, N'Cash', CAST(0xFA3A0B00 AS Date), 0, 200, 100, 100) 
INSERT [dbo].[Balances] ([id], [Account], [Month], [BegBalance], [Debit], [Credit], [EndBalance]) VALUES (5, N'Mr. Axxx', CAST(0xDB3A0B00 AS Date), 0, 200, 100, 100) 
INSERT [dbo].[Balances] ([id], [Account], [Month], [BegBalance], [Debit], [Credit], [EndBalance]) VALUES (6, N'Mr. Axxx', CAST(0xDB3A0B00 AS Date), 0, 100, 50, 50) 
INSERT [dbo].[Balances] ([id], [Account], [Month], [BegBalance], [Debit], [Credit], [EndBalance]) VALUES (7, N'Mr. Axxx', CAST(0xFA3A0B00 AS Date), 0, 100, 50, 50) 
INSERT [dbo].[Balances] ([id], [Account], [Month], [BegBalance], [Debit], [Credit], [EndBalance]) VALUES (8, N'Mr. Axxx', CAST(0xFA3A0B00 AS Date), 0, 100, 20, 80) 
SET IDENTITY_INSERT [dbo].[Balances] OFF 

после использования предыдущей функции() enter image description here

+0

Не могли бы вы добавить примеры данных? Я думаю, это может быть достигнуто. –

ответ

1

Вы можете использовать функцию LOOKUPSET и пользовательский код, чтобы получить предыдущий End Balance итог.

Перейти к Report menu/Report properties... на вкладке Code вставить эту функцию VB.

Public Function GetBegBal(values As Object) As String 
    Dim total As Double = 0 
    For Each value As Double In values 
         total = total + value 
     Next 
    Return total 
End Function 

В Beg Balance используют это выражение:

=Code.GetBegBal(
LOOKUPSET(
Fields!Account.Value & "-" & MONTH(Fields!Month.Value)-1, 
Fields!Account.Value & "-" & MONTH(Fields!Month.Value), 
Fields!EndBalance.Value, 
"DataSetName") 
) 

Заменить DataSetName фактическим именем вашей, а затем просмотреть отчет, он должен выглядеть следующим образом:

enter image description here

Примечание. Я использую функцию MONTHNAME в столбце Months, чтобы он возвращал имя месяца на основе региональные и языковые настройки на моей машине (испанский).

Дайте мне знать, если это поможет.

1

Вы можете обрабатывать его в SQL запросе вашего набора данных, попробуйте использовать LAG():

SELECT mt.*, beg.begbal FROM [dbo].[Balances] mt 
JOIN 
(
SELECT [Account] 
     ,[Month] 
     ,SUM([EndBalance]) EndBal 
     ,LAG (SUM([EndBalance]), 1, 0) OVER (PARTITION BY [Account] ORDER BY [Month] ASC) begbal 
    FROM [dbo].[Balances] 
    GROUP BY [Account] 
     ,[Month] 
) beg 
ON mt.Month = beg.Month 
AND mt.Account = beg.Account 

Обновление: без использования LAG(), попробуйте приведенный ниже код.

WITH CTE AS 
(
SELECT [Account] 
     ,[Month] 
     ,SUM([EndBalance]) EndBal 
     ,ROW_NUMBER() OVER (PARTITION BY [Account] ORDER BY [Month] ASC) RowVal 
    FROM [dbo].[Balances] 
    GROUP BY [Account] 
     ,[Month] 
) 

SELECT mt.*, ISNULL(t2.EndBal, 0) as begbal FROM CTE t1 
LEFT JOIN CTE t2 
ON t1.Account = t2.Account AND t1.RowVal = t2.RowVal + 1 
JOIN [dbo].[Balances] mt 
ON t1.Month = mt.Month AND t1.Account = mt.Account 

Кроме того, ниже выражение SSRS код вы ищете:

=IIF 
(
(RunningValue(Fields!Month.Value, CountDistinct, "Account")) = 1, 
0, 
Previous(SUM(Fields!EndBalance.Value),"MonthGrp") 
) 
+0

LAG() не поддерживается SQL Server 2008 R2 –

+0

Обновлен ответ с помощью выражения SSRS. Также замените T-SQL, используя ROW_NUMBER(). – p2k

+0

Спасибо за код выражения SSRS. Я действительно искал это. Это отлично работает для меня. –

Смежные вопросы