Запрос SQL-сервера не показывает результат за день - PullRequest
1 голос
/ 22 марта 2010

У меня есть простой производственный отчет пользователя, в котором отслеживаются ежедневные квоты.Sql возвращает данные за недели для всех пользователей и за каждый день отслеживает их итоги.Проблема в том, что если они не работают в течение дня и имеют нулевую производительность для этого дня, тогда результат запроса просто пропускает этот день и пропускает его.Я хочу вернуть дни, даже если в таблице нет записей для человека в этот день.

table:
user date 
andy 3/22/10
andy 3/22/10
andy 3/23/10
andy 3/24/10
andy 3/26/10


result:
andy
3/22/10    2
3/23/10    1
3/24/10    1
3/25/10    0
3/26/10    1

Поэтому мой вопрос заключается в том, как получить запрос на возврат этой даты 3/25/10 со счетчиком0.

(текущий запрос, который я использую):

SELECT A.USUS_ID as Processor, CONVERT(VARCHAR(10),A.CLST_STS_DTM,101) as Date,
COUNT(A.CLCL_ID) as DailyTotal

FROM CMC_CLST_STATUS A
WHERE A.CLST_STS_DTM >= (@Day) AND
DATEADD(d, 5, @Day) > A.CLST_STS_DTM

GROUP BY A.USUS_ID, CONVERT(VARCHAR(10),A.CLST_STS_DTM,101)
ORDER BY A.USUS_ID, CONVERT(VARCHAR(10),A.CLST_STS_DTM,101)

Ответы [ 3 ]

3 голосов
/ 22 марта 2010

У вас должны быть данные на эту дату, иначе sql не сможет их получить.

Наиболее распространенным способом решения этой проблемы является наличие таблицы дат, которая содержит ВСЕ даты. Тогда вы можете присоединиться к этому, что позволит вам получить нулевую запись на эту дату.

Вы можете либо сохранить эту таблицу в своей БД на постоянной основе, либо сгенерировать ее при выполнении запроса. Какой способ лучше всего зависит от использования и т. Д.

РЕДАКТИРОВАТЬ: метод CTE для создания таблицы дат

DECLARE @minDate DATETIME;
DECLARE @maxDate DATETIME;

SET @minDate = '2010-03-01 00:00:00.000';
SET @maxDate = '2010-03-10 00:00:00.000';

WITH DateRange ([date])
AS
(
    SELECT @minDate
    UNION ALL
    SELECT
        DATEADD(DAY, 1, [date])
    FROM
        DateRange
    WHERE
        DATEADD(DAY, 1, [date]) <= @maxDate
)

SELECT
    *
FROM
    DateRange

РЕДАКТИРОВАТЬ 2: Я не проверил это, но он должен работать с вашей базой данных.

DECLARE @day DATETIME

SET @day = CAST(FLOOR(CAST(GETDATE() AS float)) AS DATETIME);

WITH DateRange ([Date])
AS
(
    SELECT @day
    UNION ALL
    SELECT
        DATEADD(DAY, 1, [Date])
    FROM
        DateRange
    WHERE
        DATEADD(DAY, 1, [Date]) <= DATEADD(DAY, 5, @day)
)
SELECT
    A.USUS_ID as Processor,
    DateRange.[Date] as Date,
    COUNT(A.CLCL_ID) as DailyTotal 
FROM
    CMC_CLST_STATUS A
INNER JOIN
    DateRange
ON
    A.CLST_STS_DTM >= DateRange.[Date]
AND
    A.CLST_STS_DTM < DATEADD(DAY, 1, DateRange.[Date])
GROUP BY
    A.USUS_ID,
    DateRange.[Date]
ORDER BY
    A.USUS_ID,
    DateRange.[Date]
1 голос
/ 22 марта 2010

Это из хранимой процедуры? Если это так, создайте временную таблицу с интересующими датами, а затем используйте ее с подходящими объединениями и агрегацией для получения данных, которые вы ищете ...

0 голосов
/ 22 марта 2010

В значительной степени вам нужно объединить вашу таблицу с «таблицей» (сгенерированной функцией? Не в 2005 году, я думаю), которая содержит ВСЕ даты между датой начала и конца. Другого пути нет - SQL не будет показывать то, чего там нет.

...