使用CTE简化SQL语句

时间:2012-02-08 17:06:43

标签: sql sql-server-2008 common-table-expression cross-apply

我有如下查询:

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中使用表达式CalculatedValue

查询此类表

遗憾的是,这不起作用,因为在创建group by

时,select需要包含CTE

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

2 个答案:

答案 0 :(得分: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只是一个别名,您可以随意命名。

答案 1 :(得分:0)

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

只是一个想法。