упростить оператор SQL с помощью CTE - PullRequest
6 голосов
/ 08 февраля 2012

У меня есть запрос, подобный следующему:

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, где исгруппировать по выражению CalculatedValue

к сожалению, это не работает, потому что выбор должен уже включать group by при создании CTE

, есть ли другой способ, который я мог бы использовать дляне повторять CASE WHEN... столько раз?

Ответы [ 2 ]

7 голосов
/ 08 февраля 2012

Используйте 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 - это просто псевдоним, и вы можете назвать егокак хочешь.

0 голосов
/ 10 апреля 2014

Для вышесказанного, я думаю, вы могли бы просто сделать два слоя CTE.Первый будет рассчитывать для всех, второй будет выбирать из первого CTE и фильтровать на основе рассчитанного значения.Последний запрос будет добавлен во второй слой CTE.

Просто мысль.

...