Как я могу создать серию месяцев для присоединения разреженных данных?
Я думаю, что это довольно распространенная проблема, но я не знаю, как называется этот процесс, поэтому я опишу это на примере. Концепция заключается в том, что я хочу присоединить разреженный набор данных к полному ряду, например, дням недели, месяцам года или любому упорядоченному набору (например, для ранжирования). Пустые позиции в разреженных данных будут отображаться как 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;
Есть ли лучший способ создания полной даты и буквенно-цифровой серии для объединения данных? И что этоназывается?
Спасибо!