SQL Server: рассчитывать все дни в месяц, когда нет заказов?

Предположим, у вас есть заказы

| Order | Date | ----------------------- | 1 | 20150101 | | 2 | 20150103 | | 3 | 20150105 | | 11 | 20150211 | | 22 | 20150224 | | 33 | 20150204 | 

и дни, когда никакие заказы не являются

  | Month | NoOrdersCount | --------------------------- | 201501 | 28 | | 201502 | 25 | 

Я хочу сделать это в T-SQL. Моя первая идея – создать таблицу за год, где все дни в строке и левые присоединяются к ней с помощью заказов. Теперь сумма NULL дает нам результаты без заказов.

Как вы можете подсчитать количество NoOrders в месяц из данных транзакций, как указано выше в SQL Server 2014?

Вам не нужна дополнительная таблица. Все, что вам нужно, – это способ рассчитать количество дней в месяц. Вот один из способов:

 select year(date), month(date), (datediff(day, dateadd(day, 1 - day(min(date)), min(date), eomonth(date) + 1 - count(distinct date) ) as NoOrdersCount from dates group by year(date), month(date); 

В качестве примечания: если вы знаете, что у вас всегда будет один день в месяце, который не является 29-м, 30-м или 31-м, вы можете использовать:

 select year(date), month(date), (datediff(day, min(date), dateadd(month, 1, min(date))) - count(distinct date) ) as NoOrdersCount from dates group by year(date), month(date); 

Еще один способ получить дату окончания месяца и вычесть количество отдельных дат при наличии заказов.

 select distinct year(date),month(date), day(eomonth(date)) - (select count(distinct date) from orders o2 where year(o2.date)=year(o1.date) and month(o2.date)=month(o1.date)) from orders o1 

Подсчет может выполняться с помощью оконной функции, но не разрешен.

Похоже, это должно сделать это за вас.

 select convert(char(6), date, 112) as Month, day(eomonth(min(date))) - count(distinct date) as NoOrdersCount from dates group by convert(char(6), date, 112); 
  • Нарушение ограничения PRIMARY KEY во время репликации слиянием
  • Успешная транзакция SQL Server с неправильным идентификатором
  • SQL Combine 2 Rows за раз
  • Преобразование IS NULL в BIT
  • Случайное совпадение событий в рабочие часы в TSQL
  • SQL: объединить две таблицы без 'Join on'
  • Объединение результатов двух операторов SQL в один, показывающий новый результат
  • Добавить отсутствующие строки в набор результатов
  • Удалите все пробелы и объедините несколько строк в одну строку в SQL
  • Заменить функцию в SQL Server 2014 добавляет конечные нули в поле Char
  • SUM общее количество дней?
  • Interesting Posts
    Давайте будем гением компьютера.