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 byCTE

何度も繰り返さないようにするために使用できる他の方法はあります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 に答える