簡體   English   中英

SQL 得到上個月的零錢

[英]SQL get change from previous month

我有幾個表看起來與這個相似的表帶有這個虛擬數據:

CREATE TABLE ClientTable (
    ClientId int,
    SupervisorId int,
    ManagerId int,
    Date datetime,
    OthersNonRelevantColumns varchar
)

CREATE TABLE ClientValues (
    ClientId int,
    SupervisorId int,
    ManagerId int,
    ValueDate date,
    Value float,
    OthersNonRelevantColumns varchar
)

INSERT INTO dbo.ClientTable
VALUES
( 1,1,1, '2021-01-31', ''),
( 2,1,1, '2021-02-28', ''),
( 3,1,1, '2021-02-28', ''),
( 4,2,1, '2021-03-31', ''),
( 5,2,1, '2021-03-31', ''),
( 6,3,2, '2021-01-31', ''),
( 7,3,2, '2021-03-31', '')

INSERT INTO dbo.ClientValues
VALUES
( 1,1,1, '2021-01-31', 100.0, ''),
( 1,1,1, '2021-02-28', 90.0, ''),
( 1,1,1, '2021-03-31', 110.0, ''),
( 2,1,1, '2021-02-28', 50.0, '' ),
( 2,1,1, '2021-03-31', 75.0, '' ),
( 3,1,1, '2021-02-28', 100.0, ''),
( 3,1,1, '2021-03-31', 101.0, ''),
( 4,2,1, '2021-03-31', 90.0, ''),
( 5,2,1, '2021-01-31', 70.0, ''),

( 6,3,2, '2021-01-31', 10.0, ''),
( 6,3,2, '2021-02-28', 15.0, ''),
( 6,3,2, '2021-03-31', 30.0, ''),
( 7,3,2, '2021-03-31', 100.0, '')

我將需要按月末日期和經理分組的上個月結果的主管、客戶、價值和變化的數量,例如,以前數據的預期結果可能是這樣的。 請記住,客戶表中主管和客戶的數據是累積的

EOMDate     ManagerId   Supervisors     Clients         Value       ChangeValue     ChgPerc
2021-01-31  1           1               1               170         
2021-01-31  2           1               1               10          
2021-02-28  1           1               3               240         70              41%
2021-02-28  2           1               1               15          5               50%
2021-03-31  1           2               5               376         136             57%
2021-03-31  2           1               2               130         115             866%

到目前為止,我所擁有的是這個查詢,但我不知道如何獲得上個月的變化,而且我錯過了經理 2 的 2 月記錄

SELECT
    EOMONTH(ct.[Date]) AS EoMDate,
    ct.ManagerId,
    (SELECT count(DISTINCT ct2.SupervisorId) AS AccHolders
        FROM ClientTable ct2
        WHERE ct2.ManagerId= ct.ManagerId
        AND EOMONTH(ct2.[Date]) <= EOMONTH(ct.[Date])) AS AccountHolders,
    (SELECT count(ct3.ClientId) AS Clients
        FROM ClientTable ct3 
        WHERE ct3.ManagerId = ct.ManagerId
        AND EOMONTH(ct3.[Date]) <= EOMONTH(ct.[Date])) AS NumberOfClients,
    (SELECT SUM(cv.[Value]) AS Net
        FROM ClientValues cv
        WHERE cv.ManagerId= ct.ManagerId
        AND EOMONTH(cv.ValueDate) <= EOMONTH(ct.[Date])) NetPosition
FROM ClientTable ct
GROUP BY ct.ManagerId, EOMONTH(ct.[Date])
ORDER BY EoMDate, ct.ManagerId

您可以嘗試以下操作,它使用 window 函數從子查詢中提取您的凈值和凈 position 值,類似於您的初始嘗試,但使用來自ClientValue表的數據。

SELECT
    EoMDate, 
    ManagerId,
    Supervisors,
    Clients,
    Value,
    Value - LAG(Value) OVER (PARTITION BY ManagerId ORDER BY EoMDate) as ChangeValue,
    CAST(100*(Value - LAG(Value) OVER (PARTITION BY ManagerId ORDER BY EoMDate))/LAG(Value) OVER (PARTITION BY ManagerId ORDER BY EoMDate) AS DECIMAL(5,2)) as ChangePerc
FROM
    (
    SELECT
        EOMONTH(cv.[ValueDate]) AS EoMDate,
        cv.ManagerId,
        (
            SELECT COUNT(DISTINCT ct.SupervisorId)
            FROM ClientTable ct
            WHERE EOMONTH(ct.[Date])<=EOMONTH(cv.[ValueDate]) AND ct.ManagerId = cv.ManagerId
        )  as Supervisors,
        (
            SELECT COUNT(DISTINCT ct.ClientId)
            FROM ClientTable ct
            WHERE EOMONTH(ct.[Date])<=EOMONTH(cv.[ValueDate]) AND ct.ManagerId = cv.ManagerId
        ) as Clients,
        SUM(cv.Value) as Value
    FROM
        ClientValues cv
    GROUP BY
        EOMONTH(cv.[ValueDate]), cv.ManagerId
) t
ORDER BY
    EoMDate,ManagerId

在 Db Fiddle 上查看演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM