|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité de passage
![]() Inscription : mai 2011 Messages : 6 ![]() |
Bonjour,
je suis nouveau sur le forum mais ce forum est ma "bible" quand j'ai un problème SQL. D'habitude, je recherche si mon problème a déjà été traité et souvent je trouve et je ne pose pas de question. Cette fois, je n'ai pas trouvé de réponse dans les sujets déjà ouvert... Sous SQLServer 2005, j'ai une table des ventes structurée comme suit (je simplifie) Magasin article Montant date de vente Cette table stocke les ventes de tous les magasins pour tous les articles. Si je cherche les 10 articles les plus vendus pour un magasin donné (par exemple le magasin de Bordeaux), je fais la requete : Code :
Maintenant je voudrais généraliser cette requête pour tous les magasins, c'est à dire avoir pour chaque magasin la liste des 10 articles les plus vendus (mais en ne faisant qu'une seule requête). Bien sûr, si c'est utile, je précise qu'il existe une table des magasins qui donne la liste exhaustive des magasins. j'ai essayé : Code :
Quelqu'un a une idée du comment faire ? Merci. |
||||
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour
vous pouvez faire comme ceci : Code SQL :
|
||
|
|
00
|
|
|
#3 | ||
|
Invité de passage
![]() Inscription : mai 2011 Messages : 6 ![]() |
Merci pour la réponse mais la syntaxe ne doit pas être bonne (il doit manquer un group by et je ne vois pas la table A). J'ai rectifié en
Code :
|
||
|
|
00
|
|
|
#4 | ||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Il manque le GROUP BY dans le CROSS APPLY, mais l'idée reste bien vue :
Code :
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||
|
00
|
|
|
#5 | ||
|
Invité de passage
![]() Inscription : mai 2011 Messages : 6 ![]() |
Super, ça fonctionne avec la syntaxe suivante :
Code :
|
||
|
|
00
|
|
|
#6 | ||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
On peut aussi écrire, surtout si on veut le rang :
Code :
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||
|
00
|
|
|
#7 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
|
|
|
00
|
|
|
#8 | |||
|
Invité de passage
![]() Inscription : mai 2011 Messages : 6 ![]() |
Citation:
|
|||
|
|
00
|
|
|
#9 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Héhé non : si deux articles ont été vendus autant de fois dans la même magasin, ils auront le même rang
En revanche le rang suivant est sauté : mettons que les articles A et B aient été vendus autant de fois et que ce sont ces deux articles qui ont enregistré le plus grand nombre de ventes : dans ce cas ils prendront tous les deux le rang 1. L'article qui a le nombre de ventes juste inférieur prendra le rang 3 (il n'y a pas de rang 2). Comme on filtre sur rang <= 10, on obtient le même "effet" que le WITH TIES de TOP @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
00
|
|
|
#10 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
hmmm
pour avoir ce comportement, il faudrait me semble-t-il utiliser RANK en lieu et place de ROW_NUMBER... |
|
|
00
|
|
|
#11 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Pour avoir de bons temps de réponse, il faudrait créer une vue indexée comme suit :
Code SQL :
Avec l'index sur (idMagasin, article) : |
||
|
|
00
|
|
|
#12 | |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Citation:
Donc effectivement il faut absolument remplacer ROW_NUMBER() par RANK(). L'idée de la vue indexée est excellente, il est clair que la requête devrait s'exécuter en un temps record ensuite Dommage que vous n'ayez pas donné le code de création de l'index cluster et de la requête finale @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
|
00
|
|
|
#13 | |
|
Invité de passage
![]() Inscription : mai 2011 Messages : 6 ![]() |
Citation:
Pour la vue indexée, je vais essayer mais j'ai considérablement simplifié ma table et créer cette vue n'est pas si simple pour moi (déjà, il faut que je trouve comment on fait |
|
|
|
00
|
|
|
#14 | |||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Citation:
Mais comme je ne suis pas sûr du nom des colonnes, et qu'on est vendredi et que le week end approche... je pense que j'étais parti pour mettre plus de boulettes que de bon sens, je me suis donc abstenu mais ça doit donner quelque chose comme Code SQL :
Pour la requête, il n'est pas nécessaire de la modifier, elle devrait utiliser l'index cluster sans qu'on ait besoin de le spécifier... |
|||
|
|
00
|
|
|
#15 | |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Citation:
Grosso modo, il vous faut donc juste reprendre la sous requête du cross apply, ajouter la colonne idMagasin dans le select et dans le group by. Enfin, pour pouvoir indexer cette vue, il faut qu'elle soit liée au schéma (WITH SCHEMABINDING ). Pour cela, il vous faut spécifier le schéma dans lequel se trouve vos tables, par defaut, il s'agit de dbo : FROM dbo.MaTableil faut également utiliser COUNT_BIG à la place de COUNT. Si vous avez des soucis, n'hésitez pas à poster la structure de vos vraies tables... |
|
|
|
00
|
|
|
#16 | |
|
Invité de passage
![]() Inscription : mai 2011 Messages : 6 ![]() |
Citation:
|
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com