помогите написать запрос

надеюсь что умка
Дата: 14.11.2008 11:20:10
Есть таблица срезов данных по датам, например остатки и обороты, со следующей структурой:
table Cash (date_id number, cash_on_start_of_day number, turnover_debet number, turnover_credit number, cash_on_end_of_day number)
date_id ссылается на таблицу с датами.

Нужно написать запрос, который группирует данные по месяцам, и выводит их в таком виде:
id_даты_начала_месяца, количество_денег_на_начало_месяца,
сумма_всех_оборотов_по_дебету, сумма_всех_оборотов_по_кредиту, количество_денег_на_конец_месяца.
Подскажите плиз как это сделать, особенно не понятно как вывести в выборке кол-во денег на начало и конец месяца (это будет cash_on_start_of_day первого дня и cash_on_end_of_day последнего дня месяца)?
Добрый Э - Эх
Дата: 14.11.2008 11:25:35
надеюсь что умка
особенно не понятно как вывести в выборке кол-во денег на начало и конец месяца (это будет cash_on_start_of_day первого дня и cash_on_end_of_day последнего дня месяца)?
Ну, если ты сам не знаешь, что такое "количество денег на начало месяца и на его кончало", то мы-то уж откуда это можем знать???
прикольно
Дата: 14.11.2008 11:32:24
надеюсь что умка
..date_id ссылается на таблицу с датами..
Zloxa
Дата: 14.11.2008 11:38:18
надеюсь что умка
(это будет cash_on_start_of_day первого дня и cash_on_end_of_day последнего дня месяца)?

FIRST/LAST Syntax

Равен ли cash_on_end_of_day последнего дня месяца cash_on_start_of_day первого дня след. месяца?
Как определить принадлежность date_id number к месяцу?
Как определить какой date_id - первый в месяце, какой последий?
Zloxa
Дата: 14.11.2008 11:48:04
ЧТото вроде?
select 
   min(Cash.Date_id) keep (dense_rank first over order by Dates.Day_Date) id_даты_начала_месяца
   ,min(Cash.cash_on_start_of_day) keep (dense_rank first over order by Dates.Day_Date) количество_денег_на_начало_месяца
   ,sum(turnover_debet) сумма_всех_оборотов_по_дебету
   ,sum(turnover_credit) сумма_всех_оборотов_по_кредиту
   ,min(Cash.cash_on_end_of_day) keep (dense_rank last over order by Dates.Day_Date)  количество_денег_на_конец_месяца
  from Cash,Dates
  where Cash.Date_id = Dates.Date_id
  group by Trunc(Dates.Day_Date,'MM')
надеюсь что умка
Дата: 14.11.2008 16:20:12
Zloxa
Равен ли cash_on_end_of_day последнего дня месяца cash_on_start_of_day первого дня след. месяца?
Как определить принадлежность date_id number к месяцу?
Как определить какой date_id - первый в месяце, какой последий?
да, равен;
принадлежность можно посмотреть в таблице дат (Dates);
по датам в таблице Dates.

Zloxa,
спасибо за запрос,
понял в каком направлении копать, пока не разобрался только как работают ф-ции first и last, не работал я раньше с аналитическими ф-циями...
А, и еще там слово "over" лишнее после first, last.

Кстати, не будет здесь полезно выражение
INTERVAL число {YEAR / MONTH / DAY / HOUR / MINUTE / SECOND} 
?
Zloxa
Дата: 14.11.2008 16:54:07
надеюсь что умка,

Да, over- лишний. Прошу прощения.

Это не аналитическая функция.
Oracle® Database SQL Reference
10g Release 2 (10.2)
SQL Functions

Analytic Functions
Analytic functions compute an aggregate value based on a group of rows. They differ from aggregate functions in that they return multiple rows for each group


А order можно заменить на "пофик"
надеюсь что умка
Дата: 14.11.2008 16:57:00
...
 ,min(Cash.cash_on_end_of_day) keep (dense_rank last over order by Dates.Day_Date)  количество_денег_на_конец_месяца
...
а почему здесь min, а не max? Это значение же нужно брать из последнего дня месяца.

Что делать, если не на все дни в месяце есть строки в таблице - в этом случае date_id покажет не начало месяца, а id первой существующей записи за день из выборки за этот месяц?
Zloxa
Дата: 14.11.2008 17:09:53
надеюсь что умка
а почему здесь min, а не max

Потому что я предполагаю что Dates.Day_Date, по которой мы сортируем множество, уникален и top-ranked or bottom-ranked rows будут состоять из одной строки, по которой будет расчитан аггрегат. При условии уникальности Day_Date, не важно какую агрегатную функцию применять. min, max или avg.
Zloxa
Дата: 14.11.2008 17:16:56
надеюсь что умка
Что делать, если не на все дни в месяце есть строки в таблице - в этом случае date_id покажет не начало месяца, а id первой существующей записи за день из выборки за этот месяц?

Делать Внешнее соединение со справочником дней а не внутреннее, как в моем примере