Wie kann ich erstellen Sie eine Reihe von Monaten beitreten spärliche Daten zu?

Ich denke, das ist eine ziemlich häufige Frage, aber ich weiß nicht, was der Prozess genannt, also werde ich beschreiben es mit einem Beispiel. Das Konzept ist, dass ich beitreten soll eine sparse-dataset, um eine komplette Serie, wie die Tage der Woche, Monate des Jahres, oder jeden bestellten set (Z. B. für das ranking). Leere Positionen in den spärlichen Daten, die zeigen, wie NULL-neben der kompletten Serie.

Sagen wir, ich führen Sie die folgende Abfrage in SQL-Servers, um herauszufinden, die monatlichen Verkäufe.

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;

Wenn jedoch Umsatz nur traten im Mai und August dieses Jahres, zum Beispiel, dann die return-Ergebnis würde dann so Aussehen:

2010    August    1234
2010    May       5678

Möchte ich mein Ergebnis zurückgeben set wie folgt Aussehen:

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

Ich weiß nur einen Weg, dies zu tun, ist dies:

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;

Gibt es einen besseren Weg, um erstellen Sie das vollständige Datum und die alphanumerische Serie beizutreten Daten auf? Und was ist das genannt?

Dank!

InformationsquelleAutor Kuyenda | 2010-06-25
Schreibe einen Kommentar