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

Откуда:
Сообщений: 234
Всем привет!
Есть три таблицы:
Table1:
id, -- PK
month_num, -- Номер месяца 
month_first_dt, -- Первое число месяц
month_last_dt, -- Последнее число месяца
val

Calendar:
date_dt -- Календарная дата, PK

Table3:
id,
table1_id, -- Внешний ключ на Table1
val
Запрос нужен следующий:
select t1.id, t1.month_num, t1.month_first_dt, t1.month_last_dt, t1.val, sum(t3.val)
from Table1 t1
inner join Calendar C on t1.month_first_dt <= C.date_dt and (t1.month_last_dt + 1) >= C.date_dt
left join Table3 t3 on t1.id = t3.table1_id
group by  t1.id, t1.month_num, t1.month_first_dt, t1.month_last_dt, t1.val
В этом запросе сумму sum(t3.val) необходимо умножать на 0.5 в том случае, если C.date_dt не первое число месяца, то есть не является границей интервала.
Если добавить case when day(C.date_dt) = 1...., то придется включать C.date_dt в группировку, и тогда результат будет не тем, которые мне нужен. Можно сделать два джоина с календарем, но в Table1 много строк, и лишнее перемножение мне ни к чему.
Подскажите, пожалуйста, как быть? Нужна идея, запрос напишу :)
Если потребуется, сделаю тестовый скрипт
Спасибо!
19 сен 11, 19:05    [11301161]     Ответить | Цитировать Сообщить модератору
 Re: Перемножение с календарем, суммирование, как избежать двойного объединения?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Новичок_я
В этом запросе сумму sum(t3.val) необходимо умножать на 0.5 в том случае, если C.date_dt не первое число месяца, то есть не является границей интервала.
Если добавить case when day(C.date_dt) = 1...., то придется включать C.date_dt в группировку, и тогда результат будет не тем, которые мне нужен.

Потому что case нужно внутрь sum помещать
19 сен 11, 19:11    [11301192]     Ответить | Цитировать Сообщить модератору
 Re: Перемножение с календарем, суммирование, как избежать двойного объединения?  [new]
Новичок_я
Member

Откуда:
Сообщений: 234
Glory
Новичок_я
В этом запросе сумму sum(t3.val) необходимо умножать на 0.5 в том случае, если C.date_dt не первое число месяца, то есть не является границей интервала.
Если добавить case when day(C.date_dt) = 1...., то придется включать C.date_dt в группировку, и тогда результат будет не тем, которые мне нужен.

Потому что case нужно внутрь sum помещать

Прошу прощения, в попытке упростить задачу упустил важный момент, запрос вот такой
select t1.id, t1.month_num, t1.month_first_dt, t1.month_last_dt, [b]t1.val + sum(t3.val)[/b]
from Table1 t1
inner join Calendar C on t1.month_first_dt <= C.date_dt and (t1.month_last_dt + 1) >= C.date_dt
left join Table3 t3 on t1.id = t3.table1_id
group by  t1.id, t1.month_num, t1.month_first_dt, t1.month_last_dt, t1.val
И на 0.5 надо умножать t1.val + sum(t3.val)
19 сен 11, 19:18    [11301245]     Ответить | Цитировать Сообщить модератору
 Re: Перемножение с календарем, суммирование, как избежать двойного объединения?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Новичок_я
И на 0.5 надо умножать t1.val + sum(t3.val)

И зачем это делать сразу на этом уровне вложенности ? Нельзя сначала умножить на 0.5, а потом группировать и агрегировать ?
19 сен 11, 22:36    [11301852]     Ответить | Цитировать Сообщить модератору
 Re: Перемножение с календарем, суммирование, как избежать двойного объединения?  [new]
Новичок_я
Member

Откуда:
Сообщений: 234
Glory
Новичок_я
И на 0.5 надо умножать t1.val + sum(t3.val)

И зачем это делать сразу на этом уровне вложенности ? Нельзя сначала умножить на 0.5, а потом группировать и агрегировать ?

Не понял :( Как это?
19 сен 11, 23:33    [11302015]     Ответить | Цитировать Сообщить модератору
 Re: Перемножение с календарем, суммирование, как избежать двойного объединения?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Новичок_я
Не понял :( Как это?

Вы знаете, что такое вложенные запросы ?
20 сен 11, 09:17    [11302617]     Ответить | Цитировать Сообщить модератору
 Re: Перемножение с календарем, суммирование, как избежать двойного объединения?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31964
Новичок_я
Glory
пропущено...

И зачем это делать сразу на этом уровне вложенности ? Нельзя сначала умножить на 0.5, а потом группировать и агрегировать ?

Не понял :( Как это?
В выделенном фрагменте вставляйте свой CASE:
select id, month_num, month_first_dt, month_last_dt, val1 + sum(val3)
from (
	select t1.id, t1.month_num, t1.month_first_dt, t1.month_last_dt, t1.val as val1, t3.val as val3
	from Table1 t1
		inner join Calendar C on t1.month_first_dt <= C.date_dt and (t1.month_last_dt + 1) >= C.date_dt
		left join Table3 t3 on t1.id = t3.table1_id
) t
group by  id, month_num, month_first_dt, month_last_dt, val1 
20 сен 11, 09:56    [11302859]     Ответить | Цитировать Сообщить модератору
 Re: Перемножение с календарем, суммирование, как избежать двойного объединения?  [new]
Новичок_я
Member

Откуда:
Сообщений: 234
Не подумал про такой вариант :)

Спасибо за помощь!!!
20 сен 11, 10:48    [11303206]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить