#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
fordatetime
. Лучше всего использовать>= ..... <
. Вам нужен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. Подробнее читайте в руководстве .