2009-06-01 13 views
0

J'ai une table (consommation) comme suit:mois totaux sages dans les colonnes

DocDate ItemCode Quantity 
01.01.09 A   5 
02.01.09 A   6 

et ainsi de suite .. pour toute l'année

I ont besoin de résultats comme suit:

ItemCode Jan09Total Feb09Total Mar09Total

Le problème est que les quantités doivent être additionnées pour les mois, qui devraient être en colonnes et selon les critères de date donnés, c'est-à-dire, par exemple, de Jan à Mars 09 ou de février à juillet 09, etc.

Comment y parvenir en utilisant une requête récursive.

Merci Rahul

+0

Je ne pense pas que vous aurez besoin d'une requête récursive pour résoudre ce problème; Habituellement, c'est pour les données dans une structure hiérarchique, et vos données ne correspondent pas à ce modèle. Je voudrais consulter un livre sur les techniques SQL, comme SQL Cookbook d'Anthony Mollinaro pour des idées sur les requêtes de rapports. –

Répondre

1

Eh bien, ce n'est pas récursive, mais vous obtiendrez ce que vous voulez:

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 

Je pense que la récursivité ne ferait obstacle à l'exécution de cette requête. Êtes-vous sûr de vouloir faire ça? Ou est-ce juste des devoirs?

+0

J'utilise SQL Server et cette requête comporte de petites erreurs. Par exemple, il n'y a pas de fonction nommée MonthName, bien qu'il existe une fonction DateName qui pourrait être obtenue pour obtenir le nom du mois De plus, j'ai besoin des résultats pour qu'il y ait une colonne pour chaque mois. –

0

Vous pouvez utiliser PIVOT pour obtenir les données dans les colonnes comme vous le souhaitez, cependant, la liste des colonnes doit être définie avant la main. Vous devrez donc créer un code SQL dynamique pour les colonnes dont vous avez besoin (en fonction de votre plage de dates), puis l'exécuter pour générer votre PIVOT.

2

En supposant que vous utilisez un DB qui supporte PIVOT, vous devriez l'utiliser. Voici un exemple de code pour 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 
) 
); 

Comme l'a noté Robin, si vos colonnes varient, alors vous devrez générer dynamiquement une telle requête avec les bonnes colonnes.

0

Voici un lien vers une façon merveilleusement élégante d'implémenter la logique de pivot sur les valeurs de l'axe x KNOWN. Les pivots dynamiques sont plus difficiles.

Je ne l'ai pas lu cet article entièrement, donc s'il n'est pas utile regarder ensuite « La méthode Rozenshtein »

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

Je l'ai utilisé cela dans de nombreuses requêtes avec d'excellents résultats.