mysql - 余额趋势分析

标签 mysql sql-server

我希望按产品每月对余额进行百分比变化。月份字段代表每个月的最后一个工作日。

我尝试使用如下通用表表达式:

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

最佳答案

这是您要找的吗?

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;

关于mysql - 余额趋势分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45749828/

相关文章:

sql - 我可以使用 SQL 根据计划信息绘制实际日期吗?

ios - 统计ios app中的分享总数

从网络浏览器调用时出现 php 奇怪问题

mysql - 选择列的下一个值,其中在 SQL 中的不同列中找到最后一次出现的特定值

sql - 表列之间的一对多关系。分组和查找组合

sql-server - SQL查询成本计算,聚合 View 更快?

mysql - 从 node.js 应用程序连接到 mysql,错误 : "dyld: lazy symbol binding failed: Symbol not found: _mysql_init"

mysql - 将 Group By 应用于 If 语句结果

sql-server - 如何为 SQL Server 上的列中的每一行设置唯一 ID

json - 我想将查询存储为 JSON 对象。 (错误 : The FOR JSON clause is not allowed in a SELECT INTO statement. )