2016-04-23 3 views
1

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

Обратите внимание, что все марки времени указаны в начале каждого часа; минуты и секунды всегда 0.

Наш запрос до сих пор выглядит следующим образом:

SELECT activity_time 
     ,min(hourly_quantity) AS daily_min_quantity 
     ,product_name 
FROM (select cast(quantity_time AS date) AS quantity_time 
      ,sum(hourly_quantity) AS hourly_quantity 
      ,product_name 
     FROM Hourly_Sales 
     GROUP BY activity_time,product_name) x 
group by activity_time,product_name 

Я думаю, что нам нужно сделать либо подсчет часов в подзапрос, чтобы убедиться, что 24 и если нет, верните ноль, но я не уверен, как это сделать.

+0

Это даже не действительный запрос – Paparazzi

ответ

1

Вам необходимо использовать внешний вид, который возвращает список ваших продуктов и LEFT JOIN в ваши данные о продажах. Каждый продукт с NULL в качестве данных о продажах является продуктом с отсутствующими продажами. Используйте ISNULL или COALESCE, чтобы справиться с этим.

Если вы предоставить более подробную информацию о некоторых ваших (нет) таблиц (особенно продукта, я мог бы помочь вам в дальнейшем ...

0

Поскольку вы группирование по «activity_time, PRODUCT_NAME» в вашем подзапрос, а затем снова в вашем запросе с помощью «activity_time, product_name» (я предполагаю, что вы забыли поместить Activity_time в SELECT часть подзапроса), вы не получаете одинаковые результаты от ваших агрегатов SUM и MIN?

1

Другой способ подхода к созданию отчета стиля стиля «результаты за период» заключается в использовании даты & таблицы времени (или CTE) для создания набора дат, затем LEFT JOIN по вашему запросу и ISNULL применять умолчания.

Дата & таблицы времени делают этот вид вещи легко и быстро, но вот версия псевдо-TSQL с использованием КТР и 15 мин отчетных периодов:

DECLARE @StartDate DATETIME2 = '2016-01-01 00:00:00'; 
DECLARE @EndDate DATETIME2 = '2016-01-31 23:45:00'; 
DECLARE @Period INT = 15; 

WITH Dates AS 
(
    SELECT @StartDate DatePeriod 
    UNION ALL 
    SELECT DATEADD(MINUTE, @Period, D.DatePeriod) Date FROM Dates D 
    WHERE D.DatePeriod < @EndDate 
) 
SELECT D.DatePeriod 
    ,ISNULL(MyColumn1, 0) MyColumn1 
    --etc 
FROM Dates D 
    LEFT JOIN (
     --SELECT GOES HERE 
    ) MyData ON MyData.SomeDateTime = D.DatePeriod 
OPTION(MAXRECURSION 0) 
Смежные вопросы