Ok, então é meio difícil para mim, como um falante não nativo de inglês, escrever isso, então, por favor, tenha paciência comigo.
Eu tenho uma tabela de origem da seguinte forma:
CREATE TABLE [dbo].[Mailbox](
[ObjectSID] [nvarchar](184) NULL, --ObjectSID of Mailbox
[Database] [nvarchar](64) NULL, --Exchange Database
[PrimarySMTP] [nvarchar](254) NULL, -- eMailAddress
[ItemCount] [int] NULL, -- SUM of eMails
[Itemsize_MB] [int] NULL, -- size of Mails
[Itemsize_del_MB] [int] NULL, -- size of deleted mails
[Arch_Database] [nvarchar](64) NULL, -- Name of the Archive Exchange Database
[Arch_ItemCount] [int] NULL, -- Sum of all archived mails
[Arch_Itemsize_MB] [int] NULL, -- Size of archived mails
[Arch_Itemsize_del_MB] [int] NULL, --Size of deleted archived mails
[ScanTime] [date] NULL --Date of the last SCAN
) ON [PRIMARY]
GO
Como você pode imaginar a partir do nome, vou escrever informações de troca neste banco de dados para cada caixa de correio em nossa empresa, todos os meses.
DADOS DE AMOSTRA
Insert into Mailbox Values
(111,N'Database1',N'[email protected]',63913,16535,1,N'ARCH1',0,0,0,'2018-10-22')
,(111,N'Database1',N'[email protected]',63958,16540,2,N'ARCH1',0,0,0,'2018-10-24')
,(111,N'Database1',N'[email protected]',64533,16664,2,N'ARCH1',0,0,0,'2018-11-19')
,(222,N'Database2',N'[email protected]',296,11,0,N'ARCH2',39139,10867,0,'2018-11-19')
,(222,N'Database2',N'[email protected]',296,11,0,N'ARCH2',39139,10867,0,'2018-10-24')
,(222,N'Database2',N'[email protected]',296,11,0,N'ARCH2',39139,10867,0,'2018-10-22')
,(333,N'Database1',N'[email protected]',55292,12723,23,N'ARCH1',37302,7128,0,'2018-10-22')
,(333,N'Database1',N'[email protected]',55532,12855,25,N'ARCH1',37306,7128,0,'2018-10-24')
Minha consulta resulta em 1 linha por varredura (ScanTime) por caixa de correio (ObjectSID)
WITH
MBBB ( ObjectSID
,Itemsize_MB
,Itemsize_del_MB
,Arch_Itemsize_MB
,Arch_Itemsize_del_MB
,ScanTime
,ROW
,[Database])
AS (SELECT ObjectSID
,Itemsize_MB
,Itemsize_del_MB
,Arch_Itemsize_MB
,Arch_Itemsize_del_MB
,Scantime
,ROW_NUMBER() OVER(PARTITION BY ObjectSID ORDER BY ScanTime) ROW
,[Database]
FROM Mailbox),
Growth( [Database]
,ObjectSID
,Itemsize_MB
,Itemsize_del_MB
,Arch_Itemsize_MB
,Arch_Itemsize_del_MB
,ScanTime
,Growth)
AS (select S.[Database]
,S.ObjectSID
,S.Itemsize_MB
,S.Itemsize_del_MB
,S.Arch_Itemsize_MB
,S.Arch_Itemsize_del_MB
,S.ScanTime
,ISNULL((S.Itemsize_MB+S.Itemsize_del_MB+S.Arch_Itemsize_MB+S.Arch_Itemsize_del_MB),0)-ISNULL((X.Itemsize_MB+X.Itemsize_del_MB+X.Arch_Itemsize_MB+X.Arch_Itemsize_del_MB),0) Growth
FROM MBBB S
LEFT JOIN MBBB X
ON S.ObjectSID=X.ObjectSID
AND S.Row=X.Row+1
where s.ROW >= (select MAX(s.ROW)-3
from MBBB s))
select
g.[Database]
,g.ObjectSID
,SUM(g.Itemsize_MB + g.Itemsize_del_MB + g.Arch_Itemsize_MB + g.Arch_Itemsize_del_MB) as [Mailbox in MB]
,g.Growth
,g.ScanTime
from Growth g
Group By g.ObjectSID, g.[Database], g.ScanTime ,g.Growth
order by g.[Database]
Meu problema:
se uma caixa de correio (ObjectSID) for excluída, o novo tamanho será 0. Portanto, o crescimento deve ser negativo no último tamanho.
ou seja, a caixa de correio do usuário A tem 12 GB de tamanho em julho. A caixa de correio é excluída e não está listada em agosto (já que foi excluída) Eu quero um crescimento de -12 GB (12 GB negativos)
MAS, como a caixa de correio foi excluída, ela não está aparecendo como um novo número_linha (desde que caixa de correio = NULL == Sem novo ROW_Number() )
O problema vem agora com o agrupamento no SSRS:
Se eu agrupar todas as caixas de correio por banco de dados, vejo que para um banco de dados se tem um crescimento positivo,
mas a SOMA de todos os tamanhos de caixa de correio está diminuindo.
ou seja,
Banco de Dados__Tamanho Antigo___Crescimento__Novo Tamanho Banco de Dados1
__ 10GB __ _4GB____9GB
Eu preciso de algum tipo de junção, se entrada na tabela esquerda, e não na direita, subtraia de 0)
Espero que isso seja meio compreensível
Obrigado a todos antecipadamente.