Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/06/2011, 18h19   #1
Invité de passage
 
Inscription : novembre 2008
Messages : 4
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 4
Points : 1
Points : 1
Par défaut Order by et "LIMIT"

Salut tout le monde,
Bon après pas mal d'heure de prise de tête je me remet à vous, c'est pas vraiment dans mes habitudes mais la je pète vraiment un boulon.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT * FROM (
	SELECT * FROM (  
		SELECT item.No_,item."Code EAN13", item.Colisage, item."Sous colisage", item."Article Promo", ordre.Ordre, ordre."Fm", ordre."Sfm", 
		sal."Prix net", sal."Unit Price", client."Customer Disc_ Group",  
		total=(SELECT COUNT(*) FROM [TESTSQL].[dbo].[TESTSQL$Web_Item_Ordre] AS countOrdre WHERE (countOrdre."Fm" = 'AA')), 
 
		(CASE WHEN sal."Prix net" != 0 AND item."Article Promo" = 1   
		THEN CEILING((sal."Prix net" - (sal."Prix net" *(50 * 0.01)))*100 )/100 
		ELSE CEILING((sal."Unit Price" - (sal."Unit Price" *( convert(float(2),client."Customer Disc_ Group") * 0.01)))*100 )/100 END) Price,  
		ROW_NUMBER() OVER (ORDER BY ordre."Fm" ASC) AS row 
 
		FROM [TESTSQL].[dbo].[TESTSQL$Web_Item_Ordre] AS ordre  
 
		JOIN [TESTSQL].[dbo].[TESTSQL$Item] AS item ON ordre.[Item No_] = [item].[No_]  
		JOIN [TESTSQL].[dbo].[TESTSQL$Sales Price] AS sal ON [sal].[Item No_] = item.No_  
		JOIN [TESTSQL].[dbo].[TESTSQL$Customer] AS client ON client.No_ = '012367 '  
 
		WHERE ( ordre."Fm" = 'AA' AND sal."Sales Code" = 'EURO') 
	) a WHERE (row > 0 AND row <= 6 )
) b ORDER BY Price ASC
Voila la grosse requête du débutant :p

La requête marche bien mais le Order By ne marche que sur les 6 premiers résultats et les 6 autres après etc.., c'est a dire que sur ma page 1 j'ai bien les article trié 1€, 2€, 3€,... et sur ma page 2 je vais retourné a 2€, 3€ , 4€... Page 3 : 1€, 2€ ... par exemple, mais jamais les même article.

Si quelqu'un à une solution c'est un BOSSS !!!!
Ya une jointure foireuse aussi mais je sais pas comment faire autrement :s

alzamar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2011, 11h28   #2
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Mais que voulez vous faire exactement?

c'est quoi ca??
Code :
JOIN [TESTSQL].[dbo].[TESTSQL$Customer] AS client ON client.No_ = '012367 '
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 15h16   #3
Invité de passage
 
Inscription : novembre 2008
Messages : 4
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 4
Points : 1
Points : 1
Salut iberserk et merci,

Alors en gros la requête serait pour afficher une famille d'article (famille 'AA' dans l'exemple ), il y a une pagination donc tout ce que j'ai pu trouver pour remplacer le LIMIT de MYSQL c'est la bidouille suivante ou je sélectionne les 6 premiers articles par exemple :
Code :
1
2
3
ROW_NUMBER() OVER (ORDER BY item.Description ASC) AS row 
[......]
a WHERE (row > 0 AND row <= 6 )
Pour la jointure que tu m'as montré
Code :
JOIN [TESTSQL].[dbo].[TESTSQL$Customer] AS client ON client.No_ = '012367 '
Je sais que c'est moche mais j'ai rien trouvé d'autre qui marche pour ajouter le champ CUSTOMER DISC GROUP en fonction de l'id de l'utilisateur connecté ( '012367' )

Viens maintenant les problèmes :
Dans le CASE je me sert de CUSTOMER DISC GROUP pour calculer les prix unitaire des articles, et donc pour contourner la fameuse mauvaise jointure dans mon SELECT j'ai rajouté
Code :
(SELECT [Customer Disc_ GROUP] FROM [TESTSQL].[dbo].[TESTSQL$Customer] WHERE No_ = '012367 ') AS DISGROUP
Le problème étant que si je fais sa je ne peux pas me servir de DISCGROUP dans le CASE :s

Et le 2ieme gros problème est que je dois trier les résultats par prix/description/etc...

Pour trier par description, par exemple, pas de problème sa marche :
Code :
ROW_NUMBER() OVER (ORDER BY item.Description ASC) AS row
Par contre pour trier par prix (Price) impossible en faisant comme pour la description tout comme impossible de trier par DISCGROUP il me dit que la colonne est non valide... Pourtant dans mes résultats de requête j'ai bien les colonnes qui se rajoutent.

J'ai allégé/modifié un peu la requête et donc j'en suis la :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
SELECT * FROM (  
	SELECT 
		item.No_, item.[Article Promo],sal.[Prix net], sal.[Unit Price],
 
		(SELECT [Customer Disc_ GROUP] FROM [TESTSQL].[dbo].[TESTSQL$Customer] WHERE No_ = '012367 ') AS DISGROUP,  
 
		(CASE WHEN sal.[Prix net] != 0 AND item.[Article Promo] = 1 THEN CEILING((sal.[Prix net] - (sal.[Prix net] *(50 * 0.01)))*100 )/100 
		ELSE CEILING((sal.[Unit Price] - (sal.[Unit Price] *( convert(float(2), DISGROUP) * 0.01)))*100 )/100 END) Price,  
 
		ROW_NUMBER() OVER (ORDER BY Price ASC) AS row 
 
	FROM [TESTSQL].[dbo].[TESTSQL$Web_Item_Ordre] AS ordre  
 
		JOIN [TESTSQL].[dbo].[TESTSQL$Item] AS item ON ordre.[Item No_] = [item].[No_]  
		JOIN [TESTSQL].[dbo].[TESTSQL$Sales Price] AS sal ON [sal].[Item No_] = item.No_  
 
	WHERE ordre.[Fm] = 'AA' 
) a WHERE (row > 0 AND row <= 6 )
Ca deviens vraiment compliqué pour moi je débute sur sql server, j’espère que vous allez pouvoir m'aider.

alzamar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 15h59   #4
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 746
Points : 746
Vous ordonnez par ordre."Fm" et non par prix

Code :
1
2
 
ROW_NUMBER() OVER (ORDER BY ordre."Fm" ASC) AS row
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SELECT * FROM (
	SELECT * FROM (  
		SELECT item.No_,item."Code EAN13", item.Colisage, item."Sous colisage", item."Article Promo", ordre.Ordre, ordre."Fm", ordre."Sfm", 
		sal."Prix net", sal."Unit Price", client."Customer Disc_ Group",  
		total=(SELECT COUNT(*) FROM [TESTSQL].[dbo].[TESTSQL$Web_Item_Ordre] AS countOrdre WHERE (countOrdre."Fm" = 'AA')), 
		  
		Price,  
		ROW_NUMBER() OVER (ORDER BY Price ASC) AS row 
	 
		FROM [TESTSQL].[dbo].[TESTSQL$Web_Item_Ordre] AS ordre  
		 
		JOIN [TESTSQL].[dbo].[TESTSQL$Item] AS item ON ordre.[Item No_] = [item].[No_]  
		JOIN [TESTSQL].[dbo].[TESTSQL$Sales Price] AS sal ON [sal].[Item No_] = item.No_  
		JOIN [TESTSQL].[dbo].[TESTSQL$Customer] AS client ON client.No_ = '012367 '  
		CROSS APPLY (
			SELECT
(CASE WHEN sal."Prix net" != 0 AND item."Article Promo" = 1   
		THEN CEILING((sal."Prix net" - (sal."Prix net" *(50 * 0.01)))*100 )/100 
		ELSE CEILING((sal."Unit Price" - (sal."Unit Price" *( convert(float(2),client."Customer Disc_ Group") * 0.01)))*100 )/100 END) Price
		) AS X
		 
		WHERE ( ordre."Fm" = 'AA' AND sal."Sales Code" = 'EURO') 
	) a WHERE (row > 0 AND row <= 6 )
) b ORDER BY row ASC
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 17h46   #5
Invité de passage
 
Inscription : novembre 2008
Messages : 4
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 4
Points : 1
Points : 1
Un gros merci Sergejack tu m'as mit sur la bonne piste.

Code :
ROW_NUMBER() OVER (ORDER BY ordre."Fm" ASC) AS row
J'ai du m'embrouiller dans les copier collé sur le forum mais j'avais belle et bien testé avec 'Price'

Je vous donne la requête qui marche, si ça peut servir ...
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 
SELECT * FROM (
	SELECT 
		item.No_,
		item."Article Promo",
		ordre.Ordre,
		ordre."Fm",
		sal."Prix net",
		sal."Unit Price",
		Y.Price,
		X.discGroup,
		X.total,
		ROW_NUMBER() OVER (ORDER BY Y.Price ASC) AS row 
	FROM [TESTSQL].[dbo].[TESTSQL$Web_Item_Ordre] AS ordre  
	JOIN [TESTSQL].[dbo].[TESTSQL$Item] AS item ON ordre.[Item No_] = [item].[No_]  
	JOIN [TESTSQL].[dbo].[TESTSQL$Sales Price] AS sal ON [sal].[Item No_] = item.No_  
	CROSS APPLY (
		SELECT
			(
				SELECT 
					"Customer Disc_ Group" 
				FROM [TESTSQL].[dbo].[TESTSQL$Customer] 
				WHERE No_ = '012367 '
			) AS discGroup,
			(
				SELECT 
					COUNT(*) 
				FROM [TESTSQL].[dbo].[TESTSQL$Web_Item_Ordre] AS countOrdre 
				WHERE (countOrdre."Fm" = 'AA')
			) AS total
	) AS X
	CROSS APPLY (
		SELECT
			(
				CASE 
					WHEN sal."Prix net" != 0 AND item."Article Promo" = 1   
					THEN CEILING((sal."Prix net" - (sal."Prix net" *(50 * 0.01)))*100 )/100 
					ELSE CEILING((sal."Unit Price" - (sal."Unit Price" *( convert(float(2), X.discGroup) * 0.01)))*100 )/100 
				END
			) AS Price
	) AS Y
	WHERE ( ordre."Fm" = 'AA') 
) a 
WHERE (row > 0 AND row <= 6 ) 
ORDER BY row ASC
On ma dit que la requête serait plus propre avec une CTE mais je n'ai pas vraiment le temps de la faire, et je pense que je ne suis pas assez bon non plus ... :s

En tout cas merci bonne soirée
alzamar est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h05.


 
 
 
 
Partenaires

Hébergement Web