Sql server 将Select查询转换为CTE
我已经转换了,但结果不同。可能是我的问题。我想把简单的查询转换成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
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)
^