Несколько отсчетов из одной и той же строки с диапазоном

#sql #sql-server-2008

#sql #sql-server-2008

Вопрос:

Я пытаюсь получить количество транзакций в течение недели с заданной датой начала и датой окончания.Приведенный ниже запрос отлично работает в течение одного дня 2011-10-14

 SELECT COUNT(operationId) AS trans
  FROM hwfg_t_Tracking 
  WHERE hitTime BETWEEN '2011-10-14 00:00:00' AND '2011-10-14 23:59:59.99'
GO
  

Как я могу получить счетчик для OperationId, где время выполнения между 14,13,12,11,10,9,8 (1 неделя) с помощью одного оператора SELECT. Например, количество транзакций для 2011-10-14 в качестве столбца, 2011-10-13 в качестве другого столбца и так далее

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

1. Не используйте BETWEEN for datetime . Лучше всего использовать >= ..... < . Вам нужен PIVOT запрос с перекрестной вкладкой или.

2. приведенный выше запрос работает нормально, но мне нужно получить больше столбцов из operationsId с изменением диапазона времени попадания, скажем, с 14 до 8

3. Если hitTime имеет тип datetime , вы будете пропускать что-либо с помощью hitTime = ‘2011-10-14 23:59:59.993’ или ‘2011-10-14 23:59:59.997’ Если hitTime имеет datatime2 и имеет точность, явно определенную 0, 1 или 2, то предложение where является правильным. Слишком много задействованных типов двойной проверки, см. Комментарий Мартина Смита о том, как всего этого избежать.

Ответ №1:

Попробуйте выполнить следующий запрос для одной строки в день в указанном вами диапазоне:

 SELECT cast(hitTime AS date) AS mydate, COUNT(operationId) AS trans
FROM   hwfg_t_Tracking
WHERE  hitTime >= '2011-10-14 00:00:00' AND hitTime < '2011-10-21 00:00:00'
GROUP  BY cast(hitTime AS date)
  

Или, если вы хотите, чтобы они все были в одной строке:

 SELECT COUNT(*) AS total_sum
      ,COUNT(CASE WHEN cast(dt As date) = '2011-10-14' THEN 1 ELSE NULL END) AS day14
      ,COUNT(CASE WHEN cast(dt As date) = '2011-10-15' THEN 1 ELSE NULL END) AS day15
      ,COUNT(CASE WHEN cast(dt As date) = '2011-10-16' THEN 1 ELSE NULL END) AS day16
-- etc.
FROM   hwfg_t_Tracking
WHERE  hitTime >= '2011-10-14 00:00:00' AND hitTime < '2011-10-21 00:00:00'
  

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

1. Что, если я передам StartDate(2011-10-08) и EndDate(2011-10-14) в качестве аргументов, смогу ли я получить количество OperationId для каждого отдельного дня в виде строки?

2. @Naveen: первый запрос работает для любого временного диапазона. Второй, который вам нужно будет адаптировать к вашему временному диапазону, должен быть очевидным. Другой вариант — сводные таблицы, но они более сложные, IMO. Подробнее читайте в руководстве .