#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]
Не используйте пробелы в именах столбцов