Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > ХП в FireBird 2.0 Диалект 3. Не прерывная дата


Автор: Desperate 9.11.2018, 09:50
Всем привет.
В работе с 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

 

Автор: Akella 9.11.2018, 10:08
SUM + группировка по дате?

Автор: Desperate 9.11.2018, 12:57
Это понятно, но тогда результат будет такой:
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

Автор: Akina 9.11.2018, 13:10
Создаёте секвенс, который генерит целые от нуля до (макс. разность дат в днях минус 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)

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)