Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ХП в FireBird 2.0 Диалект 3. Не прерывная дата, Вывести данные с непрерывной датой 
:(
    Опции темы
Desperate
Дата 9.11.2018, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 11.10.2006

Репутация: нет
Всего: -1



Всем привет.
В работе с FireBird совсем зеленый smile.

Есть такая задача, 
есть таблица данных продаж, например вида : Дата продажи, Сумма

05.03.2013 | 1000
06.03.2013 | 500
06.03.2013 | 600
08.03.2013 | 2000
10.03.2013 | 300

Необходимо в результат агрегировать данные с помощью Sum(это понятно, элементарный запрос) вывести в таблицу вида
05.03.2013 | 1000
06.03.2013 | 1100
07.03.2013 | null
08.03.2013 | 2000
09.03.2013 | null
10.03.2013 | 300

т.е. создать диапазон дат и там где нет данных вывести null.

как подобное можно реализовать с помощью ХП? 
Есть идея программно создавать таблицу с диапазонов и потом джоинить к ней таблицу данных левым(правым) соединением.
затем удалять таблицу, но может есть способ проще, без использования таблиц?

Спасибо.

П.С.: Использую морду лица IBExpert

 

Это сообщение отредактировал(а) Desperate - 9.11.2018, 09:52
PM MAIL   Вверх
Akella
Дата 9.11.2018, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



SUM + группировка по дате?
PM MAIL   Вверх
Desperate
Дата 9.11.2018, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 11.10.2006

Репутация: нет
Всего: -1



Это понятно, но тогда результат будет такой:
05.03.2013 | 1000
06.03.2013 | 1100
08.03.2013 | 2000
10.03.2013 | 300

А нужно
05.03.2013 | 1000
06.03.2013 | 1100
07.03.2013 | null
08.03.2013 | 2000
09.03.2013 | null
10.03.2013 | 300
PM MAIL   Вверх
Akina
Дата 9.11.2018, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 3
Всего: 453



Создаёте секвенс, который генерит целые от нуля до (макс. разность дат в днях минус 1). Используете его как дополнительную таблицу, и с помощью DATEADD генерите все даты диапазона. LEFT JOIN-ите к нему свою таблицу. Т.е. схематично типа
Код
CREATE SEQUENCE MyGenerator;
SET MyGenerator TO 0; -- или минус один? не помню...
SELECT DATEADD(day, inc.delta, mindate.mindate) AS date, data.*
FROM       (SELECT GEN_ID(MyGenerator, 1) AS delta FROM RDB$DATABASE) AS inc
INNER JOIN (SELECT MIN(datetime) mindate FROM datatable) AS mindate ON 1
LEFT JOIN  datatable AS data ON data.datetime = DATEADD(day, inc.delta, mindate.mindate)

Ну а под свой диалект причёсывай сам...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.1120 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.