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