Как я могу создать серию месяцев для присоединения разреженных данных?

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

Допустим, я запускаю следующий запрос в SQL Server, чтобы узнать ежемесячные продажи.

SELECT
    YEAR([timestamp]),
    MONTH([timestamp]),
    COUNT(*)
FROM table1
WHERE YEAR([timestamp]) = YEAR(GETDATE())
GROUP BY
    YEAR([timestamp]),
    MONTH([timestamp])
ORDER BY
    YEAR([timestamp]) DESC,
    MONTH([timestamp]) DESC;

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

2010    August    1234
2010    May       5678

Я хочу, чтобы мой набор результатов был похож на это:

2010    January
2010    February
2010    March
2010    April
2010    May        1234
2010    June
2010    July
2010    August     5678
2010    September
2010    October
2010    November
2010    December

Единственный способ, которым я знаю, это сделать так:

SELECT
    YEAR(GETDATE()),
    month_index.month_name,
    sales_data.sales
FROM (
    SELECT 'January' as month_name, 1 as month_number
    UNION
    SELECT 'February', 2
    UNION
    SELECT 'March', 3
    UNION
    SELECT 'April', 4
    UNION
    SELECT 'May', 5
    UNION
    SELECT 'June', 6
    UNION
    SELECT 'July', 7
    UNION
    SELECT 'August', 8
    UNION
    SELECT 'September', 9
    UNION
    SELECT 'October', 10
    UNION
    SELECT 'November', 11
    UNION
    SELECT 'December', 12
) as month_index
LEFT JOIN (
    SELECT
        YEAR([timestamp]) AS year_name,
        MONTH([timestamp]) AS month_name,
        COUNT(*) AS sales
    FROM table1
    WHERE YEAR([timestamp]) = GETDATE()
    GROUP BY
        YEAR([timestamp]),
        MONTH([timestamp])
) AS sales_data
ON month_index.month_name = sales_data.month_name
ORDER BY
    month_index.month_number DESC;

Есть ли лучший способ создания полной даты и буквенно-цифровой серии для объединения данных? И что этоназывается?

Спасибо!

Ответы на вопрос(5)

Ваш ответ на вопрос