2010-12-06 5 views
0

D'accord, je n'ai pas fait de SQL depuis un moment. C'est le plus en profondeur que j'ai dû obtenir. Fondamentalement, je dois faire pivoter une table et ensuite la décomposer en fonction des dates.Pivot SQL pour plusieurs lignes ... CONFUSÉ?

À l'heure actuelle, j'ai une transaction qui passe. Il y a 3 types de transactions. Disons livrés, expédiés, retournés. Ma table comporte donc un ID de transaction, une date de transaction et un type de transaction. Je dois faire pivoter cela et compter ensuite additionner les types de transaction. J'ai ce code jusqu'ici:

SELECT 
    SUM(Delivered), 
    SUM(Shipped), 
    SUM(Returned), 
    TransactionID, 
    TransactionDate 
FROM 
    (
     (SELECT 
      TransactionID, 
      TransactionDate, 
      TransactionType 
     FROM Transactions) AS Ttable 
     PIVOT 
     (
      COUNT(TransactionType) 
      FOR TransactionTYpe IN 
      (
       [Delivered], 
       [Shipped], 
       [Returned] 
      ) 
     ) as Pvt1 
    ) 

Ceci obtient la somme du compte pour chaque type de transaction. Cependant, cela me donne les totaux pour TOUS les types de transaction qui existent. J'ai besoin de tout ça pour un bout de temps. Par exemple (et je sais que cela va être beaucoup de variables mais c'est la seule façon dont mon application peut le faire), j'ai besoin de trouver la somme de tous les types de transactions pour janvier 2010 - décembre 2012 pour chaque mois. Donc 12x3. Comment puis-je rompre comme ça? S'il vous plaît aider! Devenir fou!

Répondre

1

est ici un point de départ:

SELECT TransactionMonth, [Delivered], [Shipped], [Returned] 
from (select 
      TransactionType 
     ,cast(datename(mm, TransactionDate) + ' 1, ' + datename(yy, TransactionDate) as smalldatetime) TransactionMonth 
     from Transactions) ByMonth 
pivot (count(ByMonth.TransactionType) 
     for ByMonth.TransactionType in ([Delivered],[Shipped],[Returned]) 
     ) xx 
order by TransactionMonth 

Il n'a pas été tout à fait clair que les données sources avaient l'air ou ce que votre grille finale devrait être, donc je fait quelques hypothèses:

  • je suppose il y a une transaction à une date pour chaque TransactionId. Je l'exclut de la dernière requête et génère les totaux par mois civil
  • Je renvoie les résultats pour chaque entrée de la table. Ajoutez une clause where avec les paramètres de filtrage de date appropriés à la clause SELECT pour obtenir moins.
  • Il doit y avoir une meilleure façon de "nettoyer" un datetime dans une forme "année-mois", utilisez-le si vous le trouvez
  • J'ai testé cela sur une table similaire, puis converti à vos noms - assez sûr que je l'ai eu tout droit, mais quelques fautes de frappe peuvent avoir glissé. (J'utilisais SQL 2005.)
+0

Le problème est que j'ai besoin des colonnes. Donc, au lieu de commander par eux. J'ai besoin expédié, livré, retourné pour janvier 2010, puis expédié, livré, retourné pour février 2010. Tout cela doit être commandé. – Tom

+0

Donc, trois colonnes pour chaque année/mois requis, 1 ligne par transaction? (Cela serait utile si vous ajoutez un exemple de "résultat final comme celui-ci".) –