SSRS でレポートを更新しようとしています。クエリは、ストアド プロシージャを使用して別の同僚によって作成されました。この同僚は、プロジェクトを離れて連絡を取ることができなくなりました。彼は、いくつかの集計を追加するために、すべてのバッチにインメモリ テーブルを使用しました。
出力としての列は次のとおりです。
- バッチID
- 変換日
- ソースシステム
- 会社の種類
- MAX(B.FooterLines) AS FooterTotalLines
- MAX(SRC.TotalLines) AS SourceTotalLines
- MAX(BalancingLinesTable.BalancingLines) AS BalancingLines
- SUM(STG.TotalLines) AS StagingTotalLines
- (CAST(STG.Company AS int) * 1000000) + B.BatchID AS CompanyCode
ただし、Balancing lines という列を追加する必要があります。私はそれのためのクエリを開発しました、そしてそれは動作します:
SELECT COUNT(0) as "Balancing lines"
FROM [Source].[Staging].[TransactionLine] T
INNER JOIN
[Source].[Staging].HeaderLine H
ON T.HeaderID = H.HeaderID
where H.BatchID = 1234* and H.SourceSystemInstance = 'ABC' and AccountNumber = '98765'
*1234 should be variable -> B.BatchID and also the SourseSystemInstance 'ABC'-> B.SourceSystem
しかし、私の同僚が書いたストアド プロシージャは、私にはまだなじみがありません。私の作業クエリを彼の作業ストアド プロシージャに「追加」する方法を知っていますか?
わかりやすくするために、次の表を使用しました。
- @バッチB
- ヘッダーライン H
- フッターライン FL
- 「INNER JOIN テーブル」 BalancingLinesTable
- 「INNER JOIN テーブル」SRC
- 「LEFT JOIN テーブル」STG
ストアド プロシージャ:
USE [Source]
ALTER PROCEDURE [dbo].[usp_GetSomeCounts] (
@StartAt datetime
)
AS BEGIN
SET NOCOUNT ON;
-- Set a default for start date if none is specified
SELECT @StartAt = ISNULL(@StartAt, DATEADD(dd, -7, GETDATE()))
-- Use an in-memory table for all batches for the specified period
DECLARE @batches TABLE(BatchID int, TransformDate datetime, HeaderID nvarchar(36), CompanyType nvarchar(30), SourceSystem nvarchar(4), FooterLines int)
-- Fill in-memory table batches
INSERT INTO @batches (
BatchID
,TransformDate
,HeaderID
,CompanyType
,SourceSystem
,FooterLines
)
SELECT
H.BatchID
,H.TransformDate
,H.HeaderID
,CompanyTypeID
,H.SourceSystemInstance
,ISNULL(FL.TotalTransactionLines, 0)
FROM
Staging.HeaderLine H WITH (NOLOCK)
INNER JOIN
Staging.FooterLine FL WITH (NOLOCK)
ON
H.HeaderID = FL.HeaderID
WHERE
H.BatchDate >= @StartAt
ORDER BY
H.BatchID
/* Using in-memory table 'batches', count all valid transactions in both Source and Staging
databases. Include the footer totals */
SELECT
B.BatchID
, B.TransformDate
, B.SourceSystem
, B.CompanyType
, MAX(B.FooterLines) AS FooterTotalLines
, MAX(SRC.TotalLines) AS SourceTotalLines
, MAX(BalancingLinesTable.BalancingLines) AS BalancingLines
, SUM(STG.TotalLines) AS StagingTotalLines
, (CAST(STG.Company AS int) * 1000000) + B.BatchID AS CompanyCode
FROM
@batches B
INNER JOIN (
SELECT
B.BatchID
,B.HeaderID
,COUNT(0) as BalancingLines
FROM
@batches B
-- this 'inner join table' BalancingLinesTable is what I added
INNER JOIN
Staging.TransactionLine T WITH (NOLOCK)
ON B.HeaderID = T.HeaderID
INNER JOIN
Staging.HeaderLine H WITH (NOLOCK)
ON T.HeaderID = H.HeaderID
WHERE H.BatchID = B.BatchID AND H.SourceSystemInstance = B.SourceSystem AND AccountNumber = 399990
GROUP BY
B.BatchID
,B.HeaderID
) BalancingLinesTable ON B.BatchID = BalancingLinesTable.BatchID
INNER JOIN (
SELECT
B.BatchID
,B.HeaderID
,COUNT(0) AS TotalLines
FROM
@batches B
INNER JOIN
Staging.TransactionLine T WITH (NOLOCK)
ON
B.HeaderID = T.HeaderID
WHERE
T.LineStatus = 'N'
GROUP BY
B.BatchID
,B.HeaderID ) SRC ON B.BatchID = SRC.BatchID
LEFT JOIN (
SELECT
B.BatchID
,B.HeaderID
,MT.Company
,COUNT(0) AS TotalLines
FROM
@batches B
INNER JOIN
[Production].[dbo].[Mutated_Transactions] MT WITH (NOLOCK)
ON
B.HeaderID = MT.HeaderID
WHERE
MT.RowHasError = 'N'
GROUP BY
B.BatchID
,B.HeaderID
,MT.Company) STG ON SRC.BatchID = STG.BatchID AND SRC.HeaderID = STG.HeaderID
GROUP BY
B.BatchID
,B.TransformDate
,B.SourceSystem
,B.CompanyType
,STG.Company
ORDER BY
B.TransformDate desc
,B.BatchID
終わり