нужна помощь в написании чувствительного к дате запроса T-SQL - PullRequest
0 голосов
/ 05 августа 2011

Мне нужна помощь в написании запроса T-SQL, который сгенерирует 52 строки данных для франшизы из таблицы, которая часто будет содержать пропуски в последовательности 52 недели для франшизы (т. Е. Франшиза могла сообщать данные раз в две недели или не был в бизнесе целый год).

Таблица, к которой я обращаюсь, выглядит примерно так:

FranchiseId | Date | ContractHours | PrivateHours

и мне нужно присоединить его к таблице, подобной этой:

FranchiseId | Name

Вывод запроса должен выглядеть следующим образом:

Name | Date       | ContractHours | PrivateHours
----   ----------   -------------   ------------
AZ1    08-02-2011             292            897
AZ1    07-26-2011               0              0 -- default to 0's for gaps in sequence
...
AZ1    08-03-2010              45            125 -- row 52 for AZ1
AZ2    08-02-2011             382            239
...
AZ2    07-26-2011               0              0 -- row 52 for AZ2

Мне нужен этот стиль вывода для каждой франшизы, то есть 52 строки данных со строками по умолчанию для любых пропусков в последовательности 52 недели в одном наборе результатов. Таким образом, если имеется 100 франшиз, результирующий набор должен быть 5200 строк.

Что я пробовал

Я попробовал типичные предложения:

  • Создать таблицу со всеми возможными датами
  • LEFT OUTER Присоедините это к таблице необходимых данных

Проблемы, с которыми я сталкиваюсь:

  1. гарантирует, что для каждой франшизы их 52 строки и
  2. заполнение пробелов названием франшизы и 0 часами, не могу иметь следующее в наборе результатов:

    Name | Date       | ContractHours | PrivateHours
    ----   ----------   -------------   ------------
    NULL   08-02-2011            NULL           NULL
    

Я не знаю, куда идти отсюда? Есть ли эффективный способ написания запроса T-SQL, который будет производить требуемый вывод?

1 Ответ

4 голосов
/ 05 августа 2011

Это голые кости

  • Создание 52-недельных диапазонов
  • Кросс-соединение с франшизой
  • ВЛЕВО СОЕДИНЯЕТСЯ с фактической датой
  • ОТПРАВЛЯЕТСЯ вподставьте нули

Итак, вот так, непроверенный

;WITH cDATE AS
(
    SELECT
        CAST('20100101' AS date /*smalldatetime*/) AS StartOfWeek, 
        CAST('20100101' AS date /*smalldatetime*/) + 6 AS EndOfWeek
    UNION ALL
    SELECT StartOfWeek + 7, EndOfWeek + 7
    FROM cDATE WHERE StartOfWeek + 7 < '20110101'
), Possibles AS
(
    SELECT
        StartOfWeek, FranchiseID
    FROM
        cDATE CROSS JOIN Franchise
)
SELECT
    P.FranchiseID,
    P.StartOfWeek, 
    ISNULL(SUM(O.ContractHours), 0), 
    ISNULL(SUM(O.PrivateHours), 0)
FROM
    Possibles P
    LEFT JOIN
    TheOtherTable O ON P.FranchiseID = O.FranchiseID AND 
                    O.Date BETWEEN P.StartOfWeek AND P.EndOfWeek
GROUP BY
    P.FranchiseID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...