我的代码有效 - 我只是想知道我如何处理这个问题的诚实意见。有人可以看一下吗?
我在一家推出数字客户界面的金融机构工作。我想检查使用该界面的客户是否比其他客户具有更高的客户生命周期价值 (clv)。具体来说,我想看看客户注册我们的在线服务后 clv 如何变化。
clv 值在每年 1 月 1 日计算。客户是否注册我们的在线服务并不是集中存储的。因此,我为 2020-2024 年每年创建一个临时表,然后将它们堆叠在一起。
下面的代码有效,但我必须在 2020-2024 年每年重复它:
DROP TABLE IF EXISTS #tempclv2024;
WITH clvs AS (
SELECT
clv.CustID
, CASE
WHEN AccountId IS NULL THEN 'No'
ELSE 'Yes'
END AS account_active
, AccountId
, ROUND(clv.clv,2) AS clv_eur
, '2024' AS year_clv
FROM
BD.CLV AS clv
LEFT JOIN
KAD.Customer AS mi
ON
clv.CustID = mi.id
WHERE
clv.date = '2024-01-01'
)
SELECT
CustID
, account_active
, clv_eur
, year_clv
INTO
#tempclv2024
FROM
clvs
SELECT * FROM #tempclv2020
为了保持代码简洁,我的第一反应是创建一个循环来迭代 2020-2024 年的所有年份。我创建了下面的代码,它可以工作,但是我想知道我是否过度设计了它?我以前没有见过其他人在 SQL 中使用循环,我不知道像这样在 SQL 中循环是否有任何缺点/特殊注意事项。
有人可以看一下并给出诚实的意见吗?
非常感谢! (注意:我在 SQL Server 上使用 Transact-SQL)
DECLARE @Year INT = 2020;
DECLARE @TableName NVARCHAR(50);
DECLARE @SQL NVARCHAR(MAX);
DECLARE @FinalQuery NVARCHAR(MAX);
DROP TABLE IF EXISTS #tempclv2020;
DROP TABLE IF EXISTS #tempclv2021;
DROP TABLE IF EXISTS #tempclv2022;
DROP TABLE IF EXISTS #tempclv2023;
DROP TABLE IF EXISTS #tempclv2024;
DROP TABLE IF EXISTS ##tempfinal;
WHILE @Year <= 2024
BEGIN
SET @TableName = '##tempclv' + CAST(@Year AS NVARCHAR(4));
PRINT 'Year' + CAST(@Year AS NVARCHAR(4));
-- Drop the temporary table if it exists
SET @SQL = 'DROP TABLE IF EXISTS ' + @TableName;
EXEC sp_executesql @SQL;
-- Create the temporary table for the specific year
SET @SQL = '
WITH clvs AS (
SELECT
clv.CustID,
CASE
WHEN mi.AccountId IS NULL THEN ''No''
ELSE ''Yes''
END AS account_active,
AccountId,
ROUND(clv.clv, 2) AS clv_eur,
''' + CAST(@Year AS NVARCHAR(4)) + ''' AS year_clv
FROM
BD.CLV AS clv
LEFT JOIN
KAD.Cust AS mi
ON
clv.CustID = mi.id
WHERE
clv.date= ''' + CAST(@Year AS NVARCHAR(4)) + '-01-01''
)
SELECT
CustID,
account_active,
clv_eur,
year_clv
INTO
' + @TableName + '
FROM
clvs';
EXEC sp_executesql @SQL;
SET @Year = @Year + 1;
END
-- Combine the results using UNION ALL
SET @FinalQuery = '
SELECT * INTO ##tempfinal FROM (
SELECT * FROM ##tempclv2020
UNION ALL
SELECT * FROM ##tempclv2021
UNION ALL
SELECT * FROM ##tempclv2022
UNION ALL
SELECT * FROM ##tempclv2023
UNION ALL
SELECT * FROM ##tempclv2024
) AS CombinedData
SELECT *
FROM ##tempfinal
ORDER BY CustID, year_clv ASC';
-- Execute the final query
EXEC sp_executesql @FinalQuery;