Sql 使用Case语句转换查询

Sql 使用Case语句转换查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,我尝试使用CTE,但结果不同,我认为查询有一些问题。前面的查询很简单,但我想转换成CTE表 select sum(DATEDIFF("D",M.ActiveStart,DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0))) as Duration_Days , m.HomeBranch, m.LocationName from AX.Memberships M where m.ActiveStart < DATEADD(MONT

我尝试使用CTE,但结果不同,我认为查询有一些问题。前面的查询很简单,但我想转换成CTE表

select sum(DATEDIFF("D",M.ActiveStart,DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0))) as Duration_Days
    , m.HomeBranch, m.LocationName
from AX.Memberships M
where m.ActiveStart < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0)
and (M.ActiveEnd > DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0) or M.ActiveEnd is null)
group by m.HomeBranch, m.LocationName
问题是:

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) or M.ActiveEnd is null)
            then DATEDIFF(D,M.ActiveStart,DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0)) else 0 end) as Total_Duration
        , M.HomeBranch
        , M.LocationName
    from AX.Memberships M 
    group by M.HomeBranch, M.LocationName
)
Select Total_Duration
From CTE_ABC 
不同于

select DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) ,-1) --> this is end of the month
因此,您的查询将产生不同的结果

您的cte应该如下所示,以便在原始查询中得到相同的结果

select DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0) --> this is start of the month
问题是:

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) or M.ActiveEnd is null)
            then DATEDIFF(D,M.ActiveStart,DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0)) else 0 end) as Total_Duration
        , M.HomeBranch
        , M.LocationName
    from AX.Memberships M 
    group by M.HomeBranch, M.LocationName
)
Select Total_Duration
From CTE_ABC 
不同于

select DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) ,-1) --> this is end of the month
因此,您的查询将产生不同的结果

您的cte应该如下所示,以便在原始查询中得到相同的结果

select DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0) --> this is start of the month

旁白:尽管微软感到困惑,但它是一个case表达式,而不是语句。旁白:尽管微软感到困惑,它是一个case表达式,而不是语句。