2009-07-10 12 views
2

Pour créer des rapports, j'ai besoin de faire pivoter les résultats d'une requête unique sur chaque enregistrement. Ma déclaration actuelle est:Séquence de numérotation de valeurs uniques SQL pour Pivot

SELECT * 
FROM Sales AS x 
WHERE (select count(*) from Sales where customer_name=x.customer_name 
     and order_date>=x.order_date)<=5 
ORDER BY customer_name, order_date, price; 

Un échantillon de la sortie de la requête est:

customer_name order_date  price 
Company A  2009-02-01  800 
Company A  2009-03-01  100 
Company A  2009-04-01  200 
Company A  2009-05-01  300 
Company A  2009-06-01  500 
Company B  2009-02-01  100 
Company B  2009-02-01  800 
Company B  2009-04-01  200 
Company B  2009-05-01  300 
Company B  2009-06-01  500 

En fin de compte, l'information doit ressembler à ceci:

Customer_Name  order_date1 price1 order_date2 price2 order_date3 price3 order_date4 price4 order_date5 price5 
Company A   2009-02-01 800  2009-03-01 100  2009-04-01 200  2009-05-01 300  2009-06-01 500 
Company B   2009-02-01 100  2009-02-01 800  2009-04-01 200  2009-05-01 300  2009-06-01 500 

Je pense que je besoin d'ajouter une colonne pour "pivot_id" afin qu'il y ait un enregistrement commun pour chaque regroupement de sorte que le résultat de la requête avant le pivot ressemble à:

pivot_id customer_name order_date  price 
1   Company A  2009-02-01  800 
2   Company A  2009-03-01  100 
3   Company A  2009-04-01  200 
4   Company A  2009-05-01  300 
5   Company A  2009-06-01  500 
1   Company B  2009-02-01  100 
2   Company B  2009-02-01  800 
3   Company B  2009-04-01  200 
4   Company B  2009-05-01  300 
5   Company B  2009-06-01  500 

Quelle instruction SQL va générer un numéro d'enregistrement automatique pour chaque achat, mais aussi recommencer avec chaque customer_name ??

Travailler dans Access 2007 avec le générateur de code SQL. Ce serait génial si la solution est compatible avec Access.

Désolé pour la longueur. Merci d'avance.

Répondre

1

Que diriez-vous d'une autre sous-requête corrélée? Enregistrer vous requête, dites que Requête1 (vous voudrez probablement supprimer la clause ORDER BY de cette requête intermédiaire - seulement besoin de trier l'ensemble de résultats final):

SELECT Q1.customer_name, Q1.order_date, Q1.price, 
     (
     SELECT COUNT(*) + 1 
      FROM MyQuery AS Q2 
     WHERE Q2.customer_name = Q1.customer_name 
       AND Q2.order_date < Q1.order_date 
     ) AS pivot_id 
    FROM MyQuery AS Q1; 
+0

Peu de questions: lent -TRÈS. -Affecte le même nombre à toutes les commandes avec le même prix, ce qui arrive fréquemment. En regardant l'exemple de jeu de données ci-dessus, la société B a eu deux achats le 1er février 2009, les deux achats sont affectés un pivot_id de 1. Avec quelques modifications, encore lent, mais fonctionne! Merci! –

+0

Oui, le moteur de base de données Access n'est pas bien optimisé pour les sous-requêtes corrélées: (Envisagez de réécrire votre requête d'origine en utilisant TOP 5 pour éliminer la sous-requête * that * corrélée. – onedaywhen

Questions connexes