2017-08-18 57 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