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

Откуда: оттуда
Сообщений: 3149
Привет. Есть набор данных: даты на 1 число месяца и сумма нарастающим итогом. Задача: сформировать запрос, чтобы получить сумму по месяцам. Заджойнил таблицу саму на себя с вычитанием. Работает, но на больших объёмах инфы работает долго. Можно ли придумать что-то получше? Запрос что-то вроде
SELECT dt, table1.sum-table2.sum as sum
from 
(
 SELECT dt, sum from tbl as table1
LEFT JOIN
SELECT dt, sum from tbl as table2
ON Month(table2.dt)=Month(DateAdd(Month,-1,table1.dt))

)
2 июн 15, 10:59    [17718967]     Ответить | Цитировать Сообщить модератору
 Re: Вычитание в запросе  [new]
karamba85
Member

Откуда: оттуда
Сообщений: 3149
поправил
Month(DateAdd(Month,-1,table1.DATE_OTCH)) as dt

Вначале dt пусть будет номер месяца, за который суммы
2 июн 15, 11:01    [17718976]     Ответить | Цитировать Сообщить модератору
 Re: Вычитание в запросе  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21101
Версия сервера?
2 июн 15, 11:14    [17719049]     Ответить | Цитировать Сообщить модератору
 Re: Вычитание в запросе  [new]
karamba85
Member

Откуда: оттуда
Сообщений: 3149
2008
2 июн 15, 11:15    [17719055]     Ответить | Цитировать Сообщить модератору
 Re: Вычитание в запросе  [new]
karamba85
Member

Откуда: оттуда
Сообщений: 3149
Akina
Версия сервера?

10.50.1600.1
2 июн 15, 11:16    [17719063]     Ответить | Цитировать Сообщить модератору
 Re: Вычитание в запросе  [new]
Добрый Э - Эх
Guest
karamba85,

outer apply по top 1 подзапросу.
2 июн 15, 11:27    [17719144]     Ответить | Цитировать Сообщить модератору
 Re: Вычитание в запросе  [new]
invm
Member

Откуда: Москва
Сообщений: 9724
karamba85
Можно ли придумать что-то получше?
1. Добавить в таблицу вычисляемый столбец
alter table tbl add next_dt as dateadd(month, 1, dt)
2. Добавить индексы
create index IX_tbl__dt on tbl (dt) include ([sum]);
create index IX_tbl__next_dt on tbl (next_dt) include ([sum]);
3. Переписать запрос
select
 a.dt, a.[sum] - b.[sum], 0) as [sum]
from
 tbl a left join
 tbl b on b.next_dt = a.dt;
2 июн 15, 12:20    [17719512]     Ответить | Цитировать Сообщить модератору
 Re: Вычитание в запросе  [new]
karamba85
Member

Откуда: оттуда
Сообщений: 3149
Добрый Э - Эх
karamba85,

outer apply по top 1 подзапросу.


через временную таблицу сделал.
2 июн 15, 15:25    [17720859]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить