Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Программирование в MSSQL? / 8 сообщений из 8, страница 1 из 1
13.02.2019, 08:46
    #39773143
kjt
kjt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в MSSQL?
Добрый день, коллеги!

Пишу скрипт по маржинальности блюд в базу программы общепита.

Есть таблица с продажами блюд и есть таблица прайса.

Таблица прайса:
Код: sql
1.
2.
3.
4.
5.
id - id_dish - date_from - date_to

id_dish - id блюда
date_from - действует с
date_to - действует по




С таблицы продажи блюд по сути мне нужен только id блюда и кол-во дней продаж.
Код: sql
1.
2.
3.
4.
5.
6.
7.
Select 
[id_dish], 
[Кол-во дней продаж],
[Кол-во дней доступных для продажи]
from sales_table 
where 
date_sale between '2019-01-01' and '2019-01-14'



Задача следующая:
Нужно в запросе вывести еще два значения кроме id блюда

1. Кол-во дней доступных для продажи блюда(в периоде может быть несколько прайсов с разными периодам, но как правило периоды не пересекаются)

2. Кол-во дней продажи блюд

Как программист я бы использовал for и перебирал даты но тут это явно не прокатит )
...
Рейтинг: 0 / 0
13.02.2019, 09:28
    #39773156
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в MSSQL?
GROUP BY ... + SUM(DATEDIFF(...))

kjtкак правило периоды не пересекаютсяЗначит, пересекаются. "Нельзя быть немножко беременной" (с)
Тогда предварительно необходимо объединить пересекающиеся периоды. Поиск по форуму даст ответ (и не один), как это сделать.
...
Рейтинг: 0 / 0
13.02.2019, 09:29
    #39773159
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в MSSQL?
Akinaнеобходимо объединить пересекающиеся периодыВпрочем, вряд ли потребуются данные за период в сотню лет... тогда разумнее, наверное, наоборот - в CTE развернуть периоды в списки дат, отсеять дубли и использовать COUNT().
...
Рейтинг: 0 / 0
13.02.2019, 09:37
    #39773167
kjt
kjt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в MSSQL?
AkinaGROUP BY ... + SUM(DATEDIFF(...))

kjtкак правило периоды не пересекаютсяЗначит, пересекаются. "Нельзя быть немножко беременной" (с)
Тогда предварительно необходимо объединить пересекающиеся периоды. Поиск по форуму даст ответ (и не один), как это сделать.

Есть нюанс! Количество дней между датами ни так сложно посчитать.

Мне нужно не просто кол-во дней в прайсе, а именно те которые попадаю в диапазон выборки из таблицы продаж.
Т.е. если период выборки из таблицы продаж с 05.01.19 по 14.01.19 и есть прайс с 03.01.19 по 15.01.19, то мне нужна разница между 05.01 и 14.01

Но может быть и то что прайс может быть с 12.01 по 20.01, то мне нужна разница дней между 12.01 и 14.01

Если бы все решалось так как вы описываете то вряд ли бы я написал на форум...
...
Рейтинг: 0 / 0
13.02.2019, 10:11
    #39773188
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в MSSQL?
kjtЕсли бы все решалось так как вы описываетеИменно так и решается, как я описываю:
Akinaв CTE развернуть периоды в списки датОставить даты, которые присутствуют в обоих полученных списках, да посчитать их количество - дело совершенно элементарное.
...
Рейтинг: 0 / 0
13.02.2019, 12:18
    #39773271
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в MSSQL?
Для таких случаев не поленитесь и сделайте таблицу-календарь. В ней должны быть все даты, доступные вашей системе. И всякие доп. поля, н-р день недели, номер недели, признак выходного и т.д.
...
Рейтинг: 0 / 0
13.02.2019, 16:00
    #39773464
kjt
kjt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в MSSQL?
AkinakjtЕсли бы все решалось так как вы описываетеИменно так и решается, как я описываю:
Akinaв CTE развернуть периоды в списки датОставить даты, которые присутствуют в обоих полученных списках, да посчитать их количество - дело совершенно элементарное.

Сложно такое из воздуха сообразить. Есть какие то экземплы, статьи?
...
Рейтинг: 0 / 0
13.02.2019, 16:33
    #39773482
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в MSSQL?
kjt,

имея календарь, Вы легко подсчитаете и количество дней долга, и количество рабочих дней между датами и так далее.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Программирование в MSSQL? / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]