我是不是过度设计了? (T-SQL 中的循环)

问题描述 投票:0回答:0

我的代码有效 - 我只是想知道我如何处理这个问题的诚实意见。有人可以看一下吗?

我在一家推出数字客户界面的金融机构工作。我想检查使用该界面的客户是否比其他客户具有更高的客户生命周期价值 (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;
sql sql-server loops t-sql sql-server-2008
© www.soinside.com 2019 - 2024. All rights reserved.