6

我有如下查询:

SELECT A.a, A.b, B.c,
(CASE WHEN ... THEN ... ELSE ... END) AS CalculatedValue,
B.d
FROM    dbo.TableA A INNER JOIN
        dbo.TableB B ON (...)
WHERE (CASE WHEN ... THEN ... ELSE ... END) BETWEEN @DayStart AND @DayEnd
GROUP BY A.a, (CASE WHEN ... THEN ... ELSE ... END), B.c

避免重复多次完全相同的表达式:(CASE WHEN ... THEN ... ELSE ... END)我想定义一个 CTE 并在 select、where 和 group by 表达式中使用查询此类表CalculatedValue

不幸的是,这不起作用,因为group by在创建时选择需要已经包含CTE

有没有其他方法可以让我不重复CASE WHEN...这么多次?

4

2 回答 2

7

使用CROSS APPLY,可用于定义别名字段,然后引用它们:

SELECT A.a, 
       A.b, 
       B.c,
       CalculatedValue,
       B.d
FROM    
       dbo.TableA A 
INNER JOIN
        dbo.TableB B 
        ON (...)
CROSS APPLY 
        (SELECT (CASE WHEN ... THEN ... ELSE ... END)) CxA(CalculatedValue)
WHERE CalculatedValue BETWEEN @DayStart AND @DayEnd
GROUP BY A.a, CalculatedValue, B.c

CxA只是一个别名,您可以随意命名。

于 2012-02-08T17:09:08.873 回答
0

对于上面,我认为你可以只做两层 CTE。第一个将为所有计算,第二个将从第一个 CTE 中选择并根据计算值进行过滤。最终查询将加入第二层 CTE。

只是一个想法。

于 2014-04-10T13:22:20.100 回答