2017-08-18 56 views
0

我正在尋找每個月產品的餘額運行百分比變化。月份字段代表每個月的最後一個工作日。餘額趨勢分析

我一直在使用下面的公共表表達式的嘗試:

declare @tab table 
(DATE DATETIME, 
BALANCE DECIMAL (38,8), 
PDCT_TYPE_C VARCHAR (5), 
EXCL_C VARCHAR (1) 
) 

INSERT INTO @tab 
SELECT 
DATE, 
SUM(BALANCE), 
PDCT_TYPE_C, 
RC_EXCL_C 
from ERIC..RC_XPOS 
WHERE RC_EXCL_C IS NULL AND PDCT_TYPE_C = 'hln' 
GROUP BY XPOS_D,PDCT_TYPE_C,RC_EXCL_C 
; 
with cte as 
( 
select 
row_number() over (order by PDCT_TYPE_C,DATE) rn, 
DATE, 
BALANCE, 
PDCT_TYPE_C 
from @tab 
) 
select 
DATE, 
BALANCE, 
(((select BALANCE from cte where cte.rn=1))-(select BALANCE from cte where cte.rn=t1.rn+1)) as 'EAD MOM Difference', 
(((select BALANCE from cte where cte.rn=1))/(select BALANCE from cte where cte.rn=t1.rn+1)) as 'EAD MOM % Difference', 
PDCT_TYPE_C 
from cte as t1 

這是工作正常,如果有一個產品,這個問題雖然是如果有很多產品只是計算該行的百分比變化之前 - 當存在多種產品類型時,這可能是不同的產品。

有誰知道如何解決這個問題?

我希望像下面的結果。我有餘額,日期和產品類型字段可用,但希望計算餘額差額和餘額變化,而不必根據上述行進行行分區和計算。

如果您有任何問題,請讓我知道。

期望的結果:

Date  | Balance  | Balance Difference | Balance % Change | Product Type 
--------------------------------------------------------------- 
30/06/2017 | 4,000,000.00 | --     | --    | AP 
30/06/2017 | 2,000,000.00 | --     | --    | ZA 
30/06/2017 | 1,000,000.00 | --     | --    | LP 
31/07/2017 | 5,000,000.00 |1,000,000.00  | 0.25    | AP    
31/07/2017 | 2,000,000.00 |1,000,000.00  | 0.5    | LP 
31/07/2017 | 1,000,000.00 |-1,000,000.00  | -0.5    | ZA 
+0

您運行的是哪個版本的SQL Server? –

回答

0

這是你在找什麼?

IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL 
DROP TABLE #TestData; 

CREATE TABLE #TestData (
    [Date] DATE NOT NULL, 
    Balance MONEY NOT NULL, 
    ProductType CHAR(2) NOT NULL 
    ); 

INSERT #TestData (Date, Balance, ProductType) VALUES 
    ('2017-06-30', 4000000, 'AP'), 
    ('2017-06-30', 2000000, 'ZA'), 
    ('2017-06-30', 1000000, 'LP'), 

    ('2017-07-31', 5000000, 'AP'), 
    ('2017-07-31', 1000000, 'ZA'), 
    ('2017-07-31', 2000000, 'LP'); 

SELECT * FROM #TestData td; 

--================================================== 

SELECT 
    td.Date, 
    td.Balance, 
    [EAD MOM Difference] = td.Balance - LAG(td.Balance, 1) OVER (PARTITION BY td.ProductType ORDER BY td.Date), 
    [EAD MOM % Difference] = td.Balance/LAG(td.Balance, 1) OVER (PARTITION BY td.ProductType ORDER BY td.Date) - 1, 
    td.ProductType 
FROM 
    #TestData td 
ORDER BY 
    td.Date, 
    td.ProductType; 

--================================================== 
--================================================== 
-- SQL Server (pre 2012) version... 
WITH 
    cte_TestDataRN AS (
     SELECT 
      td.Date, td.Balance, td.ProductType, 
      RN = ROW_NUMBER() OVER (PARTITION BY td.ProductType ORDER BY td.Date) 
     FROM 
      #TestData td 
     ) 
SELECT 
    tdr1.Date, 
    tdr1.Balance, 
    [EAD MOM Difference] = tdr1.Balance - tdr2.Balance, 
    [EAD MOM % Difference] = tdr1.Balance/tdr2.Balance - 1, 
    tdr1.ProductType 
FROM 
    cte_TestDataRN tdr1 
    LEFT JOIN cte_TestDataRN tdr2 
     ON tdr1.ProductType = tdr2.ProductType 
     AND tdr1.RN = tdr2.RN + 1 
ORDER BY 
    tdr1.Date, 
    tdr2.ProductType; 
+0

我應該提到,不幸的是我只能訪問SQL Server 2008,所以我不能使用產品的延遲功能或分區,按日期排序等。我將不得不使用CTE來執行此操作 – Patty

+0

我已更新解決方案以包含「2012年以前版本」。 –

+0

謝謝大家,我得到它工作了幾天後,對我有意義。我列出的月份和3個月百分比change.I現在試圖計算從6月30日每個月的差異,我將如何做,因爲6月30日記錄將有一個不同的行數基於產品和記錄數量。 – Patty