2009-06-01 8 views
0

ich eine Tabelle (Verbrauch) haben wie folgt:Monat weise Summen in Spalten

DocDate ItemCode Quantity 
01.01.09 A   5 
02.01.09 A   6 

und so weiter .. für das ganze Jahr

ich Ergebnisse wie folgt benötigen:

ItemCode Jan09Total Feb09Total Mar09Total

Das Problem ist, dass die Mengen für die Monate zusammengefasst werden sollten, die in Spalten und nach den Kriterien für das Geben Datum, das heißt zum Beispiel von Januar bis Mar 09 oder Feb bis Juli 09 usw.

Wie erreichen Sie dies mit rekursiver Abfrage.

Dank Rahul

+0

Ich glaube nicht, dass Sie eine rekursive Abfrage benötigen, um dieses Problem zu lösen; Das ist normalerweise für Daten in einer hierarchischen Struktur, und Ihre Daten passen nicht zu diesem Modell. Ich würde mir ein Buch über SQL-Techniken ansehen, wie Anthony Mollinaros SQL-Kochbuch für Ideen zum Melden von Anfragen. –

Antwort

1

Nun, es ist nicht rekursiv, aber das wird Sie bekommen, was Sie wollen:

SELECT 
    DateName(month, DocDate) + ' ' + CAST(YEAR(DocDate) AS VARCHAR(10)) AS MonthYear, 
    ItemCode, 
    SUM(Quantity) 
FROM 
    Consumption 
GROUP BY 
    DateName(month, DocDate) + ' ' + CAST(YEAR(DocDate) AS VARCHAR(10)) AS MonthYear, 
    ItemCode 
ORDER BY 
    1,2 

denke ich Rekursion nur die Leistung dieser Abfrage behindern würde. Bist du sicher, dass du das machen willst? Oder sind das nur Hausaufgaben?

+0

Ich benutze SQL Server und diese Abfrage hat kleine Fehler. Zum Beispiel gibt es keine Funktion namens MonthName, obwohl es eine Funktion DateName gibt, die erhalten werden könnte, um den Namen des Monats zu erhalten. Außerdem brauche ich die Ergebnisse, so dass es für jeden Monat eine Spalte gibt. –

0

Sie können PIVOT verwenden, um die Daten in Spalten wie gewünscht abzurufen. Die Liste der Spalten muss jedoch vorher definiert werden. Daher müssen Sie einige dynamische SQL für die Spalten erstellen, die Sie benötigen (basierend auf Ihrem Datumsbereich) und dann das ausführen, um Ihren PIVOT zu generieren.

2

Angenommen, Sie verwenden eine DB, die PIVOT unterstützt, sollten Sie sie verwenden. Hier ist Beispielcode für Oracle:

CREATE TABLE Consumption (
    DocDate DATE, 
    ItemCode VARCHAR2(10), 
    Quantity NUMBER 
); 

INSERT INTO Consumption VALUES(to_date('2009-01-01', 'YYYY-MM-DD'), 'A', 5); 
INSERT INTO Consumption VALUES(to_date('2009-02-01', 'YYYY-MM-DD'), 'A', 6); 
INSERT INTO Consumption VALUES(to_date('2009-01-01', 'YYYY-MM-DD'), 'B', 5); 

SELECT * FROM Consumption 
PIVOT(
    sum(Quantity) 
    FOR DocDate IN (
    to_date('2009-01-01', 'YYYY-MM-DD') AS Jan09Total, 
    to_date('2009-02-01', 'YYYY-MM-DD') AS Feb09Total 
) 
); 

Wie Robin bemerkt, wenn Ihre Spalten unterschiedlich sein, dann werden Sie dynamisch eine solche Abfrage mit den richtigen Spalten erzeugen müssen.

0

Hier ist ein Link zu einer wunderbar eleganten Art der Implementierung von Pivot-Logik auf Bekannte X-Achsen-Werte. Dynamische Drehpunkte sind schwieriger.

Ich habe diesen Artikel vollständig nicht gelesen, also wenn es nicht hilfreich ist dann nachschauen „The Rozenshtein Method“

http://www.stephenforte.net/default.aspx?date=2003-08-07

ich dies in vielen Abfragen mit sehr guten Ergebnissen verwendet habe.