Ich habe eine Tabelle, in der ich unter anderem zwei Spalten haben, eine für das Startdatum und eine andere für das Enddatum. Ich muss eine Abfrage schreiben, die eine Spalte für jeden Monat des Jahres zurückgibt, und der Wert dieser Spalte ist 1, wenn der Monat andernfalls zwischen 0 und 0 liegt. Die PIVOT-Anweisung scheint das zu sein, wonach ich hier suche, aber von den besten kann ich sagen, dass die PIVOT-Klausel nach Werten sucht, nicht nach dem Wert zwischen zwei anderen. Ist die PIVOT-Klausel hier das richtige Konstrukt, oder muss ich 12 Case-Anweisungen aufschlüsseln und schreiben und diese dann aggregieren?SQL Pivot basierend auf Wert zwischen zwei Spalten
Antwort
Ich denke, ich habe die Lösung hier. Es gibt drei grundlegende Schritte:
- prüfen die ein Datum in jedem der 12 Monate, wenn dieser Zeitpunkt zwischen dem Start- und Enddatum ist
- PIVOT das Ergebnis
Um die 12 Daten, eine für jeden Monat, ich verwendete eine kleine rekursive wie WITH-Anweisung, um eine temporäre Tabelle mit 1 Spalte von 12 Daten zu erstellen:
Von hier aus kann ich CROSS JOIN diesen temporären Tisch mit der Tabelle mit den Informationen verbinden, die mir wirklich wichtig sind. Dann benutze ich WHERE date BETWEEN start AND end, um alle Einträge herauszufiltern, die nicht zu diesem Monat gehören. So etwas wie folgt aus:
SELECT other.Title, MONTH(months.date) CROSS JOIN other
WHERE months.date BETWEEN other.start AND other.end
In diesem Schritt werden wir nur vorsichtig sein müssen, um die Spalten SELECT wir ausdrücklich im Ergebnis wünschen, oder solche, die die PIVOT-Anweisung aggregiert werden verwenden.
Schließlich müssen wir das Ergebnis schwenken:
PIVOT (MAX(PID) FOR date IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]))
So ist die resultierende Abfrage könnte in etwa so aussehen:
WITH months (date) AS (
SELECT GETDATE() AS date
UNION ALL
SELECT
DATEADD(MONTH,1,date)
FROM months
WHERE DATEDIFF(MONTH,GETDATE(),date) < 12)
SELECT Title,
[1] AS January,
[2] AS February,
[3] AS March,
[4] AS April,
[5] AS May,
[6] AS June,
[7] AS July,
[8] AS August,
[9] AS September,
[10] AS October,
[11] AS November,
[12] AS December
FROM
(
SELECT other.Title,MONTH(months.date)
CROSS JOIN other
WHERE months.date BETWEEN other.startDate AND other.endDate
) AS subquery
PIVOT (MAX(PID) FOR date IN
([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) AS p
Ich habe alle anderen Komplexität gezupft ich durchgemacht habe beitreten In anderen Informationen, die ich brauchte, ist dies nicht die Abfrage, die ich geschrieben habe, aber es sollte die grundlegende Abfragestruktur kapseln, die ich benutzt habe, um das Ergebnis zu erhalten, wie ich es brauchte.
Ich würde mit den 12 Fallaussagen gehen.
Das ist eigentlich die Lösung, die ich skizziert habe, bevor ich zurück ging und sah, dass Sie darin Ihre Frage erwähnten.
Warum berechnen Sie nicht eine Spalte für den Monat und verwenden Sie sie dann zum Pivotieren?
Datumsteil (Monat, [Datum])
oder habe falsch verstehe ich das Problem?
- 1. SQL Server Pivot mehrere Spalten basierend auf einer Spalte
- 2. Pivot Zeilen in Spalten basierend auf Zustand
- 3. SQL Server Pivot auf mehrere Spalten
- 4. SQL Server: Pivot auf mehreren Spalten
- 5. SQL Pivot mit mehreren Spalten
- 6. SQL - holen Datensätze basierend auf einem Zustand von zwei Spalten
- 7. SQL-Auswahl zum Referenzieren einer Suche basierend auf zwei Spalten
- 8. Sql zu Timediff zwischen zwei Zeilen basierend auf ID finden
- 9. SQL Pivot mit Duplikaten und gleichen zwei ersten Spalten
- 10. neue Spalten basierend auf Übereinstimmung zwischen zwei vorhandenen Spalten aus zwei Datenrahmen
- 11. Mehrere Spalten Pivot in T-SQL
- 12. SQL Dynamische Pivot - wie man Spalten bestellen
- 13. SQL-Abfrage zwischen zwei Spalten passen
- 14. Pivot-Spalte und Merge basierend auf ersten drei Spalten
- 15. Wie wird der Spalte basierend auf der berechneten Differenz zwischen zwei DateTime-Spalten ein Wert zugewiesen?
- 16. Dialog zwischen zwei Benutzersteuerung basierend auf Benutzerereignissen
- 17. Mysql wählen Gewinner basierend auf zwei Spalten
- 18. Auswählen eindeutiger Zeilen basierend auf zwei Spalten
- 19. SQL: Wert berechnet, basierend auf zwei verschiedene Bedingungen
- 20. Wählen Sie Wert zwischen zwei Spalten aus der Datentabelle
- 21. SQL Pivot aus mehreren Tabellen und Spalten
- 22. SQL Server: anzeigen Zeilen als Spalten/Pivot
- 23. Sql kombinieren Wert von zwei Spalten als Primärschlüssel
- 24. SQL Server: dynamischer Pivot über 5 Spalten
- 25. Dynamische Pivot-Spalten ohne dynamische SQL-Anweisung?
- 26. SQL Query Pivot-Tabelle Zeilen in Spalten
- 27. Difference zwei Datenrahmen basierend auf zwei Spalten Python Panda
- 28. SQL Pivot auf Teilmenge
- 29. SQL: Dynamisches Umbenennen von Spalten basierend auf Zeilenwerten
- 30. SQL Server PIVOT auf Schlüsselwerttabelle