2010-11-07 8 views
1

Je suis un débutant dans SQL, espère que quelqu'un peut me aider à ce sujet:résumé SQL par ID avec la période de comparaison de période

je Articles Catégorie Tableau:

ItemID | ItemName | ItemCategory | Active/Inactive 
100  Carrot  Veg   Yes 
101  Apple  Fruit   Yes 
102  Beef  Meat   No 
103  Pineapple Fruit   Yes 

et moi avons une vente tableau:

Date  | ItemID | Sales 
01/01/2010 100  50 
05/01/2010 101  200 
06/01/2010 101  250 
06/01/2010 102  300 
07/01/2010 103  50 
08/01/2010 100  100 
10/01/2010 102  250 

Comment puis-je obtenir un tableau récapitulatif des ventes par article par période comme ci-dessous (avec seul élément actif)

ItemID | ItemName | ItemCategory | (01/01/2010 – 07/01/2010) | (08/01/2010 – 14/01/1020) 
100  Carrot  Veg    50       100 
101  Apple  Fruit   450       0 
103  Pineapple Fruit   0       0 
+1

Quelle est la base pour créer les périodes? 1 semaine toujours? – InSane

Répondre

0

Une solution très sale

SELECT s.ItemId, 
     (SELECT ItemName FROM Items WHERE ItemId = s.ItemId) ItemName, 
     ISNULL((SELECT Sum(Sales)FROM sales 
      WHERE [Date] BETWEEN '2010/01/01' AND '2010/01/07' 
      AND itemid = s.itemid 
      GROUP BY ItemId),0) as firstdaterange, 
     ISNULL((SELECT Sum(Sales)FROM sales 
      WHERE [Date] BETWEEN '2010/01/08' AND '2010/01/14' 
      AND itemid = s.itemid 
      GROUP BY ItemId), 0) seconddaterange 
FROM Sales s 
INNER JOIN Items i ON s.ItemId = i.ItemId 
WHERE i.IsActive = 'Yes' 
GROUP BY s.ItemId 

Encore une fois une solution sale, aussi les dates sont hardcoded. Vous pouvez probablement transformer ceci en une procédure stockée en prenant les dates comme paramètres.

Je ne suis pas trop au courant de la commande PIVOT mais peut-être que ça vaudra un google.

+0

Renvoie une erreur, "Nombre incorrect d'arguments utilisés avec la fonction dans l'expression de requête" ISNULL ((SELECT Sum (Ventes) FROM Ventes WHERE [Date] ENTRE '2010/01/01' ET '2010/01/07' ET itemid = s.itemid GROUP BY ItemID), 0 '. – user499737

+0

Quel DB utilisez-vous, je l'ai juste essayé dans mssql et cela fonctionne très bien.Essayez de supprimer le ISNULL() .Je l'ai mis là pour qu'il affiche 0 au lieu de nulls pour une valeur 0. – Kamal

+0

Désolé compagnon, j'ai oublié de mentionner que j'utilise Microsoft Access, j'ai essayé de supprimer l'ISNULL, mais l'avertissement que j'ai est "Data type incompatibilité dans l'expression des critères", des idées ce qui a causé l'erreur? – user499737

0

Vous pouvez faire pivoter les données à l'aide de l'opérateur SQL PIVOT. Malheureusement, cet opérateur a une portée limitée en raison de l'exigence de pré-spécifier les colonnes de sortie.

Vous réalisez normalement ceci en groupant sur une colonne calculée (dans ce cas, une qui calcule le nombre de semaine ou le premier jour de la semaine dans lequel chaque rangée tombe). Vous pouvez ensuite générer SQL à la volée avec des colonnes dérivées en utilisant SELECT DISTINCT week FROM result, ou simplement déposer le résultat dans Excel et utiliser sa fonction de table pivotante.

Questions connexes