Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Программирование в MSSQL?  [new]
kjt
Member

Откуда:
Сообщений: 8
Добрый день, коллеги!

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

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

Таблица прайса:
id - id_dish - date_from - date_to

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



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


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

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

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

Как программист я бы использовал for и перебирал даты но тут это явно не прокатит )
13 фев 19, 08:46    [21808012]     Ответить | Цитировать Сообщить модератору
 Re: Программирование в MSSQL?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20221
GROUP BY ... + SUM(DATEDIFF(...))

kjt
как правило периоды не пересекаются
Значит, пересекаются. "Нельзя быть немножко беременной" (с)
Тогда предварительно необходимо объединить пересекающиеся периоды. Поиск по форуму даст ответ (и не один), как это сделать.
13 фев 19, 09:28    [21808041]     Ответить | Цитировать Сообщить модератору
 Re: Программирование в MSSQL?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20221
Akina
необходимо объединить пересекающиеся периоды
Впрочем, вряд ли потребуются данные за период в сотню лет... тогда разумнее, наверное, наоборот - в CTE развернуть периоды в списки дат, отсеять дубли и использовать COUNT().
13 фев 19, 09:29    [21808046]     Ответить | Цитировать Сообщить модератору
 Re: Программирование в MSSQL?  [new]
kjt
Member

Откуда:
Сообщений: 8
Akina
GROUP 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

Если бы все решалось так как вы описываете то вряд ли бы я написал на форум...
13 фев 19, 09:37    [21808057]     Ответить | Цитировать Сообщить модератору
 Re: Программирование в MSSQL?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20221
kjt
Если бы все решалось так как вы описываете
Именно так и решается, как я описываю:
Akina
в CTE развернуть периоды в списки дат
Оставить даты, которые присутствуют в обоих полученных списках, да посчитать их количество - дело совершенно элементарное.
13 фев 19, 10:11    [21808094]     Ответить | Цитировать Сообщить модератору
 Re: Программирование в MSSQL?  [new]
L_argo
Member

Откуда:
Сообщений: 1140
Для таких случаев не поленитесь и сделайте таблицу-календарь. В ней должны быть все даты, доступные вашей системе. И всякие доп. поля, н-р день недели, номер недели, признак выходного и т.д.
13 фев 19, 12:18    [21808275]     Ответить | Цитировать Сообщить модератору
 Re: Программирование в MSSQL?  [new]
kjt
Member

Откуда:
Сообщений: 8
Akina
kjt
Если бы все решалось так как вы описываете
Именно так и решается, как я описываю:
Akina
в CTE развернуть периоды в списки дат
Оставить даты, которые присутствуют в обоих полученных списках, да посчитать их количество - дело совершенно элементарное.


Сложно такое из воздуха сообразить. Есть какие то экземплы, статьи?
13 фев 19, 16:00    [21808634]     Ответить | Цитировать Сообщить модератору
 Re: Программирование в MSSQL?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7406
kjt,

имея календарь, Вы легко подсчитаете и количество дней долга, и количество рабочих дней между датами и так далее.
13 фев 19, 16:33    [21808700]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить