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

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

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

Таблица прайса:
Код: 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
Программирование в MSSQL?
    #39773156
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GROUP BY ... + SUM(DATEDIFF(...))

kjtкак правило периоды не пересекаютсяЗначит, пересекаются. "Нельзя быть немножко беременной" (с)
Тогда предварительно необходимо объединить пересекающиеся периоды. Поиск по форуму даст ответ (и не один), как это сделать.
...
Рейтинг: 0 / 0
Программирование в MSSQL?
    #39773159
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinaнеобходимо объединить пересекающиеся периодыВпрочем, вряд ли потребуются данные за период в сотню лет... тогда разумнее, наверное, наоборот - в CTE развернуть периоды в списки дат, отсеять дубли и использовать COUNT().
...
Рейтинг: 0 / 0
Программирование в MSSQL?
    #39773167
kjt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
kjt
Гость
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
Программирование в MSSQL?
    #39773188
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kjtЕсли бы все решалось так как вы описываетеИменно так и решается, как я описываю:
Akinaв CTE развернуть периоды в списки датОставить даты, которые присутствуют в обоих полученных списках, да посчитать их количество - дело совершенно элементарное.
...
Рейтинг: 0 / 0
Программирование в MSSQL?
    #39773271
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для таких случаев не поленитесь и сделайте таблицу-календарь. В ней должны быть все даты, доступные вашей системе. И всякие доп. поля, н-р день недели, номер недели, признак выходного и т.д.
...
Рейтинг: 0 / 0
Программирование в MSSQL?
    #39773464
kjt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
kjt
Гость
AkinakjtЕсли бы все решалось так как вы описываетеИменно так и решается, как я описываю:
Akinaв CTE развернуть периоды в списки датОставить даты, которые присутствуют в обоих полученных списках, да посчитать их количество - дело совершенно элементарное.

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

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


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