0

J'essaie de mettre à jour un rapport dans SSRS. La requête est créée par un autre collègue à l'aide d'une procédure stockée, qui a quitté le projet et ne peut plus contacter. Il a utilisé une table en mémoire pour tous les lots afin d'ajouter quelques agrégations.Table en mémoire multiple INNER JOIN

Les colonnes en tant que sorties sont:

  • BatchID
  • TransformDate
  • SourceSystem
  • CompanyType
  • MAX (B.FooterLines) AS FooterTotalLines
  • MAX (AS) SRC.TotalLines SourceTotalLines
  • MAX (BalancingLinesTable.Balancing Lines) AS BalancingLines
  • SUM (STG.TotalLines) AS StagingTotalLines
  • (CAST (STG.Company int) * 1000000) + B.BatchID AS CompanyCode

Cependant je dois ajouter une colonne supplémentaire appelé lignes d'équilibrage. J'ai développé la requête pour cela et cela fonctionne:

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 

Mais, la procédure stockée écrite par mon collègue est encore étrangère à moi. Savez-vous comment «ajouter» ma requête de travail à sa procédure stockée de travail?

Pour la clarté de la table utilisés:

  • @batches B
  • HeaderLine H
  • FooterLine FL
  • 'INNER JOIN table' BalancingLinesTable
  • 'INNER JOIN table'
  • SRC
  • 'LEFT JOIN table' STG

La procédure stockée:

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 

FIN

+0

Peut-être que demander à ton collègue? – peterm

+0

Je peux arriver avec une histoire de BS. Mais c'est une question technique qui peut être résolue sans connaître le «côté commercial». Le fait est que j'ai du mal à l'atteindre ... – Danny

Répondre

0

Wow .. après avoir changé accoutnumber = 98765 à '98765' je me suis débarrassé de l'erreur. Mais la sortie qui en résulte est toujours vide. Il semble que j'ai oublié d'ajouter [BalancingLines] dans la colonne SSRS. Ouais .. Je sais ..