Операции с датами в Qlikview

Автор Ирина, 12 февраля 2015, 12:22:28

« назад - далее »

Ирина

Добрый день!
Возникла следующая задачка, не пойму как ее реализовать. Подкиньте, пожалуйста идейку.
У меня есть следующие поля:
- наименование акции
- даты проведения
- продажи в каждую дату
Пример тут https://yadi.sk/i/UKxngxf4ed6Ga

Что бы хотелось:
1. Подсчитать сколько дней длиться каждая акция. Например, 3 или 4 дня.
2. Для каждой акции проставить номер дня акции - 1й день, 2й день, 3й день и т.д. (может быть до 15 дней)
3. И в завершении сделать табличку вида:

Наименование акции   1й день    2й день    3й день     и т.д.
Prior                               68%           16%        14%
MM-dadak                      75%           16%         8%
Лесная сказка               65%           19%         15%

bibis

А в чем проблема ?
ДатаКонца - ДатаНачала= продолжительность.

day (ДатаКонца - ДатаНачала) - измерение в диаграмме.


или я чего-то недопонял? Было бы продуктивнее, если бы вы выложили примеры ваших таблиц.

admin

Присоединяюсь, можно посмотреть схему?

Ирина

Схема простая - табличка со следующими полями:
- наименование акции
- даты проведения
- продажи в каждую дату
Или выложить пример экселя для наглядности?

Проблема в том что у всех акций абсолютно разные даты проведения. Хотелось бы понять как продажи распределяются по дням, сколько продается в 1й день, сколько во 2й и т.д. Для этого для каждой акции и для каждого ее дня нужно назначить порядковую нумерацию дня - 1й, 2й и т.д.
Вопрос - с помощью какой функции это можно сделать, чтобы потом построить сводную.

bibis

#4
Вопрос в :
Цитата: Ирина от 13 февраля  2015, 11:40:25  
- продажи в каждую дату
Это в каком виде представлено?  365 полей в таблице(по числу дат) и на в некоторых из них число?
Да лучше эксель выложить.

Т.е. мой вариант не подошел?
КонДата- Начдата дадут как раз число дней. Ничего не мешает поставить это выражение,как измерение таблицы и получить как раз продажи на 1й, 2й и т.д. день акции.

П.с. пример ваш не могу посмотреть. Пишу с работы -  тут сайт заблокирован.

Ирина

Нет, данные представлены следующим образом:

       1 столбец                 2 столбец      3 столбец
Наименование акции    Дата акции    Продажи, руб.
Prior                                01.02.14          3000
Prior                                02.02.14          2500
Prior                                03.02.14          1000
MM-dadak                       15.04.14          5000
MM-dadak                       16.04.14          4000
MM-dadak                       17.04.14          2000
MM-dadak                       18.04.14           500
Лесная сказка                20.05.14          3000
Лесная сказка                21.05.14          1000
Лесная сказка                22.05.14           300

Таким образом акции проходят в разные дни и длятся от 3х дней до 15 дней.

А хочется построить следующую таблицу:

Наименование акции   1й день    2й день    3й день     и т.д.
Prior                               68%           16%        14%
MM-dadak                      75%           16%         8%
Лесная сказка               65%           19%         15%

Где бы программа сама определяла по каждой акции 1й день, 2й день и т.д.
Т.е. нужна я так понимаю функция, которая бы проставляла порядковый номер дня в диапазоне дней. Диапазоном дней надо брать даты продажи по каждой акции.

admin

#6
Добрый день.
Самое простое решение - формирование поля для хранения порядкового номера дня акции в скрипте.
Например:

tmp1:
LOAD * INLINE [
    Акция,Дата,Продажи
    Prior,01.02.2014,3000
    Prior,02.02.2014,2500
    Prior,03.02.2014,1000
    MM-dadak,15.04.2014,5000
    MM-dadak,16.04.2014,4000
    MM-dadak,17.04.2014,2000
    MM-dadak,18.04.2014,500
    Лесная сказка,20.05.2014,3000
    Лесная сказка,21.05.2014,1000
    Лесная сказка,22.05.2014,300
];

NoConcatenate
LOAD *,
if(Акция<>Previous(Акция),1,Peek(ДеньАкции)+1) as ДеньАкции
Resident tmp1
Order by Акция, Дата;
DROP Table tmp1;


Смысл в том, что мы упорядочиваем таблицу по акциям и датам и сравнивая текущее и предыдущее значение поля Акции определяем запись для новой акции и группы дат. Проставляя 1 как начало счетчика, далее подсчитываем записи по каждой акции.
Но, если есть разрывы в датах, скажем за 15.04 сразу 17.04 это решение придется модифицировать в зависимости от постановки задачи.

Ирина

Неужели нет никакой функции счетчика?
Может быть с помощью aggr....счетчик для каждой акции?

admin

А чем приведенное решение не тянет на роль счетчика?
Думаю, можно составить выражение. Но жертвуя производительностью.
Ведь ядру QV придется в памяти вычислять ранги по группам значений акций, датам.
Затем сопоставлять вычисленные номера дней с каждой датой каждой акции, опять же на лету в памяти.
И в итоге по этим измерениям еще и проводить вычисления.
Для составления такой формулы даже у опытных гуру уйдет больше времени чем дополнительный запрос и формирование колонки в скрипте.
К тому же, полученное выражение в одной сводной таблице может не сработать в другой.
А здесь вы получаете обычно поле и возможность использовать его без каких-либо условностей.

Ирина

Я поняла, спасибо, буду думать как лучше поступить...

Яндекс.Метрика