2017-09-13 1 views
1

Bonjour Je travaille sur un ensemble de données pour un rapport SSRS et j'ai une question qui donne le nombre total de demandes de l'arriéré:SQL Server 2014 Sélectionnez total pour chaque jour

SELECT 
COUNT(*) as NB 
FROM p_rqt WITH (NOLOCK) 
INNER JOIN p_cpy WITH (NOLOCK) ON p_cpy.CpyInCde = p_rqt.OrigCpyInCde 
WHERE 
    CpyTypInCde IN (27, 31) 
    AND p_rqt.RqtNatInCde IN (74, 75, 76) 
    AND HeadRqtInCde = 0 
    AND p_rqt.OrigCpyInCde LIKE CASE WHEN @Client = 0 THEN '%' ELSE @Client END 
    AND ((RcvDte < DATEADD(day, 1, @DateDeb) AND RqtEndDte IS NULL) OR 
(RcvDte < DATEADD(day, 1, @DateDeb) AND RqtEndDte > DATEADD(day, 1, @DateDeb))) 

et je veux récupérer le montant total restant par jour. J'ai essayé beaucoup de choses comme ceci:

SELECT CONVERT(date,rcvdte,103), count(*) as nb 
FROM p_rqt p WITH (NOLOCK) 
INNER JOIN p_cpy WITH (NOLOCK) ON p_cpy.CpyInCde = p.OrigCpyInCde 
WHERE 
    CpyTypInCde IN (27, 31) 
    AND p.RqtNatInCde IN (74, 75, 76) 
    AND HeadRqtInCde = 0 
    AND ((RcvDte < DATEADD(day, 1, '20170901') AND RqtEndDte IS NULL) OR (RcvDte < DATEADD(day, 1, '20170901') AND RqtEndDte > DATEADD(day, 1, '20170901'))) 
    group by CONVERT(date,rcvdte,103) 
    order by CONVERT(date,rcvdte,103) 

J'ai essayé jointure sous-requêtes, Somme et d'autres choses mais tout ce que je peux réussir à faire est d'avoir le nombre d'enregistrements ajoutés par jour et je veux quelque chose comme ceci:

date:    NB: 
01/01/2017  1950 
02/01/2017  1954    (+4 items) 
03/01/2017  1945    (-9 items) 

Merci

+1

données que nous pouvons exécuter votre requête contre serait utile, un coup d'oeil à ceci: http: // www.sqlservercentral.com/blogs/spaghettidba/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ – Tanner

+0

Je suggère de faire les calculs dans SSRS et de garder votre requête aussi minimal (et rapide) que possible. Dans SSRS vous pouvez utiliser RunningValue pour les totaux cumulatifs https://stackoverflow.com/questions/16462826/how-to-i-get-cumulative-monthly-subtotals-in-ssrs – niktrs

+0

Eh bien je voudrais, mais il est comme le design ceci est une table avec UNION multiple et ils ne veulent pas que je le fasse d'une autre manière – wololo

Répondre

0

donc j'ai trouvé une solution, mais il est vraiment lent, je poste encore l'échantillon réponse de toute façon

  DECLARE @Tb TABLE ( Colonne1 Datetime, Colonne2 INT) 
DECLARE @Debut Datetime = '01/09/2017' 
WHILE @Debut < '13/09/2017' 
BEGIN 
    DECLARE @Compteur int = (
     SELECT 
       COUNT(1) NB 
       FROM p_rqt WITH (NOLOCK) 
       INNER JOIN p_cpy WITH (NOLOCK) ON p_cpy.CpyInCde = p_rqt.OrigCpyInCde 
       WHERE 
         CpyTypInCde IN (27, 31) 
         AND p_rqt.RqtNatInCde IN (74, 75, 76) 
         AND HeadRqtInCde = 0 
         AND p_rqt.OrigCpyInCde LIKE '%' 
         AND (
           (RcvDte < @Debut AND RqtEndDte IS NULL) 
           OR 
           (RcvDte < @Debut AND RqtEndDte > @Debut) 
         ) 
    ) 
    INSERT INTO @Tb (Colonne1, Colonne2) VALUES (@Debut, @Compteur) 
    SET @Debut = DATEADD(day, 1, @Debut) 
    IF @Debut > '13/09/2017' 
    BREAK 
    ELSE 
    CONTINUE 
    END 
    SELECT * FROM @Tb 
0

utilisation LAG:

WITH cte AS (
    SELECT 
     CONVERT(date, rcvdte, 103) AS date, 
     COUNT(*) AS nb 
    FROM p_rqt p WITH (NOLOCK) 
    INNER JOIN p_cpy WITH (NOLOCK) 
     ON p_cpy.CpyInCde = p.OrigCpyInCde 
    WHERE 
     CpyTypInCde IN (27, 31) AND 
     p.RqtNatInCde IN (74, 75, 76) AND 
     HeadRqtInCde = 0 AND 
     ((RcvDte < DATEADD(day, 1, '20170901') AND RqtEndDte IS NULL) OR (RcvDte < DATEADD(day, 1, '20170901') AND RqtEndDte > DATEADD(day, 1, '20170901'))) 
    GROUP BY CONVERT(date, rcvdte, 103) 
    ORDER BY CONVERT(date, rcvdte, 103) 
) 

SELECT 
    t1.date, 
    (SELECT SUM(t2.nb) FROM cte t2 WHERE t2.date <= t1.date) AS nb, 
    CASE WHEN t1.nb - LAG(t1.nb, 1, t1.nb) OVER (ORDER BY t1.date) > 0 
     THEN '(+' + (t1.nb - LAG(t1.nb, 1, t1.nb) OVER (ORDER BY t1.date)) + ' items)' 
     ELSE '(' + (t1.nb - LAG(t1.nb, 1, t1.nb) OVER (ORDER BY t1.date)) + ' items)' 
    END AS difference 
FROM cte t1 
ORDER BY t1.date; 
+0

Il n'a pas fonctionné en dehors de la partie différence, j'ai toujours le nombre d'enregistrements ajoutés par jour = / – wololo