首页 > 解决方案 > 将 CTE 转换为触发器

问题描述

我已将此 CTE 数据更新到一个表中,并且我希望该表每月自动更新,以便该表将使用月份数据进行更新。同样,在屏幕截图中,它显示了上个月(10 月)的数据。

每个月后自动换表和更新数据。如果我们要实现触发器,那么在 CTE 中应用的最佳触发器是什么,代码如何与触发器一起工作。任何人都可以帮助我用 CTE 编写触发器。

WITH CTE_ABC AS 
(
    SELECT
        SUM(CASE 
               WHEN M.ActiveStart < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0) 
                    AND M.ActiveEnd > DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0) 
                  THEN 1 ELSE 0 
             END) AS No_of_Live_Member, 
        SUM(CASE 
               WHEN M.ActiveEnd BETWEEN DATEADD(month, DATEDIFF(month, 0, GETDATE()) - 1, 0) 
                    AND DATEADD(month, DATEDIFF(MONTH, 0,Getdate()), -1)  
                  THEN 1 ELSE 0 
            END) AS No_of_Member_Cancelled,
        M.HomeBranch,
        M.LocationName
    FROM
        AX.Mem M 
    GROUP BY
        M.HomeBranch, M.LocationName 
)
SELECT
    DATEPART(m, DATEADD(m, -1, GETDATE())) AS Month, 
    DATEPART(yyyy, DATEADD(m, -1, GETDATE())) AS Year, 
    CAST(No_of_Member_Cancelled AS DECIMAL(10, 0)) /  CAST(NULLIF(No_of_Live_Member, 0) AS DECIMAL(10,0)) AS Current_Attrition_Rate,
    HomeBranch,
    LocationName
FROM
    CTE_ABC
WHERE
    No_of_Member_Cancelled / NULLIF(No_of_Live_Member, 0) IS NOT NULL

请看附图

标签: sqltsql

解决方案


这个问题有点不清楚,但如果问题是如何基于 CTE 执行更新,则语法如下:

;with cte as (
    ... your query ...
)
update trends set ... whatever you need to update ...
from trends
join cte 
     on ... however you need to join between your cte and trends table

此查询可以打包为存储过程,或直接输入 SQL 代理并每月运行,或根据需要运行。

另请记住,如果有帮助,您可以拥有多个 CTE,如下所示。在您的情况下,您在 CTE 之后的查询可能是第二个 CTE,然后在更新中使用。

;with cte1 as (
   ... you first query
)
,cte2 as (
   select blah from cte1
)
update trends set ...
from trends
join cte2 (etc)

推荐阅读