Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Группировка по вычисляемому на основе запроса полю  [new]
OVT256
Member

Откуда: Москва
Сообщений: 20
Добрый день!
Пересел с SYBASE на MSSQL и уперся в то, что многие вещи стали выглядеть иначе (нет, не хуже, но по-другому)
Был запрос:
SELECT
 t1.f1,
 t1.f2,
 (SELECT SUM(f3) FROM t2 WHERE t2.f1 <= t1.f1) AS X,
 SUM(t1.f3) AS Y
FROM t1 
WHERE X > 0 
GROUP BY t1.f1, t1.f2, X

Как этот запрос будет выглядеть с точки зрения синтаксиса T-SQL'2005?
10 апр 13, 09:31    [14159982]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по вычисляемому на основе запроса полю  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
Не будет он выглядеть. Алиасы можно только в ORDER BY использовать.

Но можно обернуть в подзапрос и сгруппировать на верхнем уровне, там уже конечно по алиасу. Суть та же, кодить меньше.
10 апр 13, 09:38    [14160009]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по вычисляемому на основе запроса полю  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Наверное, как-то так:
SELECT
 t1.f1,
 t1.f2,
 X,
 SUM(t1.f3) AS Y
FROM t1 OUTER APPLY (SELECT SUM(f3) FROM t2 WHERE t2.f1 <= t1.f1) AS Z(X)
WHERE X > 0 
GROUP BY t1.f1, t1.f2, X
10 апр 13, 09:43    [14160025]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по вычисляемому на основе запроса полю  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
SELECT t1.f1,t1.f2,t2.X,SUM(t1.f3) Y
FROM t1 CROSS APPLY (SELECT SUM(t2.f3) FROM t2 WHERE t2.f1<=t1.f1 HAVING SUM(t2.f3)>0) t2(X)
GROUP BY t1.f1, t1.f2, t2.X;
10 апр 13, 09:44    [14160030]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по вычисляемому на основе запроса полю  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Хотя нет, всё-таки CROSS APPLY корректнее.
SELECT
 t1.f1,
 t1.f2,
 X,
 SUM(t1.f3) AS Y
FROM t1 CROSS APPLY (SELECT SUM(f3) FROM t2 WHERE t2.f1 <= t1.f1) AS Z(X)
WHERE X > 0 
GROUP BY t1.f1, t1.f2, X
10 апр 13, 09:46    [14160035]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по вычисляемому на основе запроса полю  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
OVT256
SELECT
 t1.f1,
 t1.f2,
 (SELECT SUM(f3) FROM t2 WHERE t2.f1 <= t1.f1) AS X,
 SUM(t1.f3) AS Y
FROM t1 
WHERE X > 0 
GROUP BY t1.f1, t1.f2, X


Как этот запрос будет выглядеть с точки зрения синтаксиса T-SQL'2005?
Так:
SELECT
 t1.f1,
 t1.f2,
 (SELECT SUM(f3) FROM t2 WHERE t2.f1 <= t1.f1) AS X,
 SUM(t1.f3) AS Y
FROM t1 
WHERE (SELECT SUM(f3) FROM t2 WHERE t2.f1 <= t1.f1) > 0 
GROUP BY t1.f1, t1.f2, (SELECT SUM(f3) FROM t2 WHERE t2.f1 <= t1.f1)

Или так:
SELECT f1, f2, X, SUM(f3) AS Y
FROM (
  SELECT
     t1.f1,
     t1.f2,
     (SELECT SUM(f3) FROM t2 WHERE t2.f1 <= t1.f1) AS X,
     t1.f3
  FROM t1 
) as t
WHERE X > 0 
GROUP BY f1, f2, X

Или так:
WITH cte (
  SELECT
     t1.f1,
     t1.f2,
     (SELECT SUM(f3) FROM t2 WHERE t2.f1 <= t1.f1) AS X,
     t1.f3
  FROM t1 
) 
SELECT f1, f2, X, SUM(f3) AS Y
FROM cte
WHERE X > 0 
GROUP BY f1, f2, X
10 апр 13, 10:30    [14160268]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по вычисляемому на основе запроса полю  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
alexeyvg
Так:
SELECT
 t1.f1,
 t1.f2,
 (SELECT SUM(f3) FROM t2 WHERE t2.f1 <= t1.f1) AS X,
 SUM(t1.f3) AS Y
FROM t1 
WHERE (SELECT SUM(f3) FROM t2 WHERE t2.f1 <= t1.f1) > 0 
GROUP BY t1.f1, t1.f2, (SELECT SUM(f3) FROM t2 WHERE t2.f1 <= t1.f1)
Если попробуете (я утром попробовал), то узнаете, что подзапрос в GROUP BY не допускается
10 апр 13, 10:37    [14160303]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по вычисляемому на основе запроса полю  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
iap
alexeyvg
Так:
SELECT
 t1.f1,
 t1.f2,
 (SELECT SUM(f3) FROM t2 WHERE t2.f1 <= t1.f1) AS X,
 SUM(t1.f3) AS Y
FROM t1 
WHERE (SELECT SUM(f3) FROM t2 WHERE t2.f1 <= t1.f1) > 0 
GROUP BY t1.f1, t1.f2, (SELECT SUM(f3) FROM t2 WHERE t2.f1 <= t1.f1)

Если попробуете (я утром попробовал), то узнаете, что подзапрос в GROUP BY не допускается
А, понятно, спасибо...

Писал всегда через подзапросы/cte (так короче и понятнее), так что не сталкивался...
10 апр 13, 10:45    [14160375]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по вычисляемому на основе запроса полю  [new]
OVT256
Member

Откуда: Москва
Сообщений: 20
Фантастический форум! За час - куча вариантов!
Спасибо!
10 апр 13, 11:33    [14160684]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить