Инструкция SQL Case и Группировка по

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня были проблемы с этой формулой. Я пытаюсь сделать данные компактными, используя оператор case, чтобы сгруппировать продолжительность использования в 15 минут, 30 минут, 1 час и т. Д. Однако всякий раз, когда я запускаю код ниже. Он не выполняет агрегирование на основе Даты транзакции, Области, Кода, Группы продолжительности.

 SELECT  [Area],  CONVERT(VARCHAR(10),[Time],111) as [Transaction Date],  [Code],  CASE   WHEN [Duration] gt;= 7200 THEN '5 Days or More'  WHEN [Duration] gt;= 5760 AND [Duration] lt; 7200 THEN '4 Days'  WHEN [Duration] gt;= 4320 AND [Duration] lt; 5760 THEN '3 Days'  WHEN [Duration] gt;= 2880 AND [Duration] lt; 4320 THEN '2 Days'  WHEN [Duration] gt; 1380 AND [Duration] lt; 2880 THEN '1 Days'  ELSE '0 Days'   END AS 'Duration Group',  SUM ([#ofSales]) AS [Volume] FROM   my Table WHERE   [ID] NOT LIKE '8787%'   AND [#ofSales] gt;= 1 GROUP BY   [Time], [Area], [Code],  CASE   WHEN [Duration] gt;= 7200 THEN '5 Days or More'  WHEN [Duration] gt;= 5760 AND [Duration] lt; 7200 THEN '4 Days'  WHEN [Duration] gt;= 4320 AND [Duration] lt; 5760 THEN '3 Days'  WHEN [Duration] gt;= 2880 AND [Duration] lt; 4320 THEN '2 Days'  WHEN [Duration] gt; 1380 AND [Duration] lt; 2880 THEN '1 Days'  ELSE '0 Days'   END ORDER BY   [Transaction Date], [Area], [Duration Group]  

Комментарии:

1. WHEN [Duration] gt;= 5760 AND [Duration] lt; 7200 THEN '4 Days' может быть упрощено как WHEN [Duration] gt;= 5760 THEN '4 Days' и т.д.

2. Разве 1380 не должно быть 1440? 1380 минут-это 23 часа. К вашему сведению, более простым способом создания равномерно распределенного ведра было бы ceiling(duration/24/60) или floor(duration/24/60)

3. В выбранной вами части вы делаете следующее: ПРЕОБРАЗУЙТЕ(VARCHAR(10),[Время],111) в [Дату транзакции], — и в ГРУППЕ ПО вы группируетесь по [Времени]. Используя стиль 111, вы получаете дату в формате ГГГГ/мм/дд. Если [Время] является фактическим типом данных datetime, то группировка выполняется в это конкретное время, а не только в ожидаемую дату.

Ответ №1:

Вы можете получить ошибку во фразе «заказать по» Из-за использования столбца, но попробуйте выполнить следующее, это может быть проще с помощью дополнительного запроса

 SELECT [Transaction_Date], [Area], [Duration_Group], SUM ([#ofSales]) AS [Volume]from (  SELECT  [Area]  ,CONVERT(VARCHAR(10),[Time],111) as [Transaction_Date]  ,[Code]  ,[#ofSales]  ,CASE   WHEN [Duration] gt;= 7200 THEN '5 Days or More'  WHEN [Duration] gt;= 5760 AND [Duration] lt; 7200 THEN '4 Days'  WHEN [Duration] gt;= 4320 AND [Duration] lt; 5760 THEN '3 Days'  WHEN [Duration] gt;= 2880 AND [Duration] lt; 4320 THEN '2 Days'  WHEN [Duration] gt; 1380 AND [Duration] lt; 2880 THEN '1 Days'  ELSE '0 Days'   END AS Duration_Group  FROM my Table  WHERE [ID] Not Like '8787%' AND [#ofSales] gt;= 1  ) tt Group BY [Transaction_Date], [Area], [Duration_Group]  ORDER BY [Transaction_Date], [Area], [Duration_Group]  

Не используйте пробелы в именах столбцов