2017-09-13 150 views
1

你好我工作在SSRS 報表中的數據集,我有一個查詢,其給出了積壓的總要求:的SQL Server 2014中選擇總每天

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))) 

,我想找回每天剩餘的總金額。 我試過很多事情是這樣的:

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) 

我試過內部聯接子查詢,點心和其他的東西 但我能設法做的是有每 天添加的記錄數量,我想是這樣這樣的:

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

謝謝

+1

樣本數據,一起來看看這個:HTTP:// www.sqlservercentral.com/blogs/spaghettidba/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ – Tanner

+0

我建議在SSRS中進行計算並保留您的查詢儘可能小(和快)。在SSRS內部,你可以使用RunningValue進行累計總計https://stackoverflow.com/questions/16462826/how-to-i-get-cumulative-monthly-subtotals-in-ssrs – niktrs

+0

嗯,我想,但它是設計像這是一張帶有多個UNION的表格,他們不希望我以另一種方式做 – wololo

回答

0

所以,我找到了一個解決方案,但它實在是太慢了, 我仍然張貼答案反正

  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

使用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

它除了差異部分外沒有任何作用, 我還有每天添加的記錄數量= / – wololo