Sql server 将Select查询转换为CTE

Sql server 将Select查询转换为CTE,sql-server,tsql,Sql Server,Tsql,我已经转换了,但结果不同。可能是我的问题。我想把简单的查询转换成CTE表 SELECT COUNT(*) AS Previous_Live_Members, m.HomeBranch, m.LocationName FROM AX.Mem M WHERE m.ActiveStart < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 13, 0) AND (m.ActiveEnd > DATEA

我已经转换了,但结果不同。可能是我的问题。我想把简单的查询转换成CTE表

SELECT
    COUNT(*) AS Previous_Live_Members, m.HomeBranch, m.LocationName    
FROM
    AX.Mem  M 
WHERE
    m.ActiveStart < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 13, 0)
    AND (m.ActiveEnd > DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 13, 0) OR M.ActiveEnd IS NULL)
GROUP BY
    m.HomeBranch, m.LocationName

CTE版本缺少一对括号

您正在ActiveEnd上使用查询,其中ActiveEnd>。。。或者ActiveEnd为空。这也应该在CTE版本的括号中

比较这一行

WITH CTE_A AS 
(
    SELECT
        SUM(CASE 
               WHEN M.ActiveStart < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 13, 0)
                    AND M.ActiveEnd > DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 13, 0) OR M.ActiveEnd IS NULL
                 THEN 1 
                 ELSE 0 
            END) AS Previous_No_of_Live_Member,
        M.HomeBranch,
        M.LocationName
    FROM
        AX.Mem M 
    GROUP BY 
        M.HomeBranch, M.LocationName 
)
SELECT
    Previous_No_of_Live_Member,
    HomeBranch,
    LocationName
FROM  
    CTE_A
使用CTE版本

...
and (m.ActiveEnd > DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 13, 0) or M.ActiveEnd is null)
我认为应该用^表示我认为括号应该放在哪里:

...
AND 
M.ActiveEnd > DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 13, 0) 
                          or M.ActiveEnd is null then 1 else 0 end)

嗨,John,为什么不把第一个查询的代码复制到cte中呢?密码when和where是两个不同的东西。实际上这不是一个单独的查询,我有一些其他的计算。但此查询部分的结果与原始查询不同。两个查询甚至不相同。你希望如何得到同样的结果?将select查询转换为cte非常困难:cte为{select query}select*from cte;
...
AND 
(M.ActiveEnd > DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 13, 0) 
^                         or M.ActiveEnd is null) then 1 else 0 end)
                                                ^