OVH Cloud OVH Cloud

Requete complexe (le retour !!!)

5 réponses
Avatar
Fred
CREATE TABLE Categories
(ID_Categorie INT IDENTITY PRIMARY KEY NOT NULL,
Lib_Cat=E9gorie VARCHAR(25),
Rang_Categorie VARCHAR(5),
Reference_Categorie VARCHAR(5))


Bonjour,

Je souhaiterais cr=E9=E9r une requete SQL complexe mais on=20
m'a deja fait comprendre
plusieurs fois que les infos que je fournissais =E9taient=20
incoh=E9rents donc me revoici
avec de meilleurs renseignements je pense .... (Merci=20
Fred)

Il s'agit ici d'une table pour contenir un menu avec des=20
cat=E9gories et des=20
sous cat=E9gories

CREATE TABLE Categories
(ID_Categorie INT IDENTITY PRIMARY KEY NOT NULL,
Lib_Cat=E9gorie VARCHAR(25),
Rang_Categorie VARCHAR(5),
Reference_Categorie VARCHAR(5))

Voila !!!

Donc maintenant les enregistrements de ma table

ID_Categorie Lib_Categorie Rang_Categorie =20
reference_Categorie

17 Menu3 1 =20
18 Menu2 1
21 Menu1 1
36 SousMenu1 =20
2 17
37 SousMenu2 =20
2 17
49 SousMenu3 =20
2 17
50 TEST1 =20
2 18
55 SousMenu4 =20
2 17 =20
56 TEST2 =20
2 18
59 Bidule1 =20
2 21
61 Bidule2 =20
2 21
63 Bidule3 =20
2 21

Je dois r=E9cup=E9rer ID_Categorie,Lib_Categorie du rang 1 (=20
rang_categorie=3D1)=20
pour lesquels les rubriques filles ne d=E9passent pas le=20
nombre de 3=20
SousMenus MAXI (<=3D3)

On observe dans la table :

rang 2 ref 17 : 4 entr=E9es
rang 2 ref 18 : 2 entr=E9es
rang2 ref 21 : 3 entr=E9es

Je dois donc r=E9cup=E9rer les ID_Categorie 18 et 21 ainsi=20
que leur=20
Lib_Categorie de niveau 1 et les ordonnant par=20
Lib_Categorie ASC


Au final la requete doit retourner :

ID_Categorie Lib_Categorie
21 Menu1
18 Menu3


Est ce possible ??? en 1 seule requete ???

Merci de votre aide

Fred

5 réponses

Avatar
Sébastien Carriot
Bonjour,

Si je ne m'abuse, le résultat à trouver est Menu2 et non Menu3...
Si tel est le cas voilà la requête pour obtenir ce résultat :

select c2.lib_categorie, c.reference_categorie
from categories c, categories c2
where c.rang_categorie = 2
and c.reference_categorie = c2.id_categorie
group by c2.lib_categorie, c.reference_categorie
having count(*) <= 3

En ajoutant un ", Count(*) As NbCat" dans le SELECT on obtient aussi le
nombre de sous-catégories de la catégorie de rang 1.

Cordialement,

Sébastien


"Fred" a écrit dans le message de
news:4f9e01c4808a$86114f20$
CREATE TABLE Categories
(ID_Categorie INT IDENTITY PRIMARY KEY NOT NULL,
Lib_Catégorie VARCHAR(25),
Rang_Categorie VARCHAR(5),
Reference_Categorie VARCHAR(5))


Bonjour,

Je souhaiterais créér une requete SQL complexe mais on
m'a deja fait comprendre
plusieurs fois que les infos que je fournissais étaient
incohérents donc me revoici
avec de meilleurs renseignements je pense .... (Merci
Fred)

Il s'agit ici d'une table pour contenir un menu avec des
catégories et des
sous catégories

CREATE TABLE Categories
(ID_Categorie INT IDENTITY PRIMARY KEY NOT NULL,
Lib_Catégorie VARCHAR(25),
Rang_Categorie VARCHAR(5),
Reference_Categorie VARCHAR(5))

Voila !!!

Donc maintenant les enregistrements de ma table

ID_Categorie Lib_Categorie Rang_Categorie
reference_Categorie

17 Menu3 1
18 Menu2 1
21 Menu1 1
36 SousMenu1
2 17
37 SousMenu2
2 17
49 SousMenu3
2 17
50 TEST1
2 18
55 SousMenu4
2 17
56 TEST2
2 18
59 Bidule1
2 21
61 Bidule2
2 21
63 Bidule3
2 21

Je dois récupérer ID_Categorie,Lib_Categorie du rang 1 (
rang_categorie=1)
pour lesquels les rubriques filles ne dépassent pas le
nombre de 3
SousMenus MAXI (<=3)

On observe dans la table :

rang 2 ref 17 : 4 entrées
rang 2 ref 18 : 2 entrées
rang2 ref 21 : 3 entrées

Je dois donc récupérer les ID_Categorie 18 et 21 ainsi
que leur
Lib_Categorie de niveau 1 et les ordonnant par
Lib_Categorie ASC


Au final la requete doit retourner :

ID_Categorie Lib_Categorie
21 Menu1
18 Menu3


Est ce possible ??? en 1 seule requete ???

Merci de votre aide

Fred
Avatar
Fred
Merci
je vais tester ca tout de suite !
effectivement j'ai fait une petite erreur (menu2 ->menu3)
Merci
mais a quoi servent (c2 et c) avant le nom des colonnes ??
je connais que les bases du SQL

Fred



-----Message d'origine-----
Bonjour,

Si je ne m'abuse, le résultat à trouver est Menu2 et non


Menu3...
Si tel est le cas voilà la requête pour obtenir ce


résultat :

select c2.lib_categorie, c.reference_categorie
from categories c, categories c2
where c.rang_categorie = 2
and c.reference_categorie = c2.id_categorie
group by c2.lib_categorie, c.reference_categorie
having count(*) <= 3

En ajoutant un ", Count(*) As NbCat" dans le SELECT on


obtient aussi le
nombre de sous-catégories de la catégorie de rang 1.

Cordialement,

Sébastien


"Fred" a écrit dans le message de
news:4f9e01c4808a$86114f20$
CREATE TABLE Categories
(ID_Categorie INT IDENTITY PRIMARY KEY NOT NULL,
Lib_Catégorie VARCHAR(25),
Rang_Categorie VARCHAR(5),
Reference_Categorie VARCHAR(5))


Bonjour,

Je souhaiterais créér une requete SQL complexe mais on
m'a deja fait comprendre
plusieurs fois que les infos que je fournissais étaient
incohérents donc me revoici
avec de meilleurs renseignements je pense .... (Merci
Fred)

Il s'agit ici d'une table pour contenir un menu avec des
catégories et des
sous catégories

CREATE TABLE Categories
(ID_Categorie INT IDENTITY PRIMARY KEY NOT NULL,
Lib_Catégorie VARCHAR(25),
Rang_Categorie VARCHAR(5),
Reference_Categorie VARCHAR(5))

Voila !!!

Donc maintenant les enregistrements de ma table

ID_Categorie Lib_Categorie Rang_Categorie
reference_Categorie

17 Menu3 1
18 Menu2 1
21 Menu1 1
36 SousMenu1
2 17
37 SousMenu2
2 17
49 SousMenu3
2 17
50 TEST1
2 18
55 SousMenu4
2 17
56 TEST2
2 18
59 Bidule1
2 21
61 Bidule2
2 21
63 Bidule3
2 21

Je dois récupérer ID_Categorie,Lib_Categorie du rang 1 (
rang_categorie=1)
pour lesquels les rubriques filles ne dépassent pas le
nombre de 3
SousMenus MAXI (<=3)

On observe dans la table :

rang 2 ref 17 : 4 entrées
rang 2 ref 18 : 2 entrées
rang2 ref 21 : 3 entrées

Je dois donc récupérer les ID_Categorie 18 et 21 ainsi
que leur
Lib_Categorie de niveau 1 et les ordonnant par
Lib_Categorie ASC


Au final la requete doit retourner :

ID_Categorie Lib_Categorie
21 Menu1
18 Menu3


Est ce possible ??? en 1 seule requete ???

Merci de votre aide

Fred


.



Avatar
Fred
Je viens d'essayer
ca ne marche pas !
je n'ai peut etre pas précisé qu'il s'agissait d'une base
access consultée par une page ASP en ODBC

j'ai d'abord essayé dans l'interpreteur access

access me retourne 'incohérence de type dans une
expression'

Avez vous une idée de quoi ca peut être ?

Merci
Avatar
Fred BROUARD
Fred a écrit:
Merci
je vais tester ca tout de suite !
effectivement j'ai fait une petite erreur (menu2 ->menu3)
Merci
mais a quoi servent (c2 et c) avant le nom des colonnes ??
je connais que les bases du SQL



des alias ou surnommage des tables.

A lire : http://sqlpro.developpez.com/SQL_AZ_2.html#SELECT_as


A +


Fred




-----Message d'origine-----
Bonjour,

Si je ne m'abuse, le résultat à trouver est Menu2 et non



Menu3...

Si tel est le cas voilà la requête pour obtenir ce



résultat :

select c2.lib_categorie, c.reference_categorie



from categories c, categories c2



where c.rang_categorie = 2
and c.reference_categorie = c2.id_categorie
group by c2.lib_categorie, c.reference_categorie
having count(*) <= 3

En ajoutant un ", Count(*) As NbCat" dans le SELECT on



obtient aussi le

nombre de sous-catégories de la catégorie de rang 1.

Cordialement,

Sébastien


"Fred" a écrit dans le message de
news:4f9e01c4808a$86114f20$
CREATE TABLE Categories
(ID_Categorie INT IDENTITY PRIMARY KEY NOT NULL,
Lib_Catégorie VARCHAR(25),
Rang_Categorie VARCHAR(5),
Reference_Categorie VARCHAR(5))


Bonjour,

Je souhaiterais créér une requete SQL complexe mais on
m'a deja fait comprendre
plusieurs fois que les infos que je fournissais étaient
incohérents donc me revoici
avec de meilleurs renseignements je pense .... (Merci
Fred)

Il s'agit ici d'une table pour contenir un menu avec des
catégories et des
sous catégories

CREATE TABLE Categories
(ID_Categorie INT IDENTITY PRIMARY KEY NOT NULL,
Lib_Catégorie VARCHAR(25),
Rang_Categorie VARCHAR(5),
Reference_Categorie VARCHAR(5))

Voila !!!

Donc maintenant les enregistrements de ma table

ID_Categorie Lib_Categorie Rang_Categorie
reference_Categorie

17 Menu3 1
18 Menu2 1
21 Menu1 1
36 SousMenu1
2 17
37 SousMenu2
2 17
49 SousMenu3
2 17
50 TEST1
2 18
55 SousMenu4
2 17
56 TEST2
2 18
59 Bidule1
2 21
61 Bidule2
2 21
63 Bidule3
2 21

Je dois récupérer ID_Categorie,Lib_Categorie du rang 1 (
rang_categorie=1)
pour lesquels les rubriques filles ne dépassent pas le
nombre de 3
SousMenus MAXI (<=3)

On observe dans la table :

rang 2 ref 17 : 4 entrées
rang 2 ref 18 : 2 entrées
rang2 ref 21 : 3 entrées

Je dois donc récupérer les ID_Categorie 18 et 21 ainsi
que leur
Lib_Categorie de niveau 1 et les ordonnant par
Lib_Categorie ASC


Au final la requete doit retourner :

ID_Categorie Lib_Categorie
21 Menu1
18 Menu3


Est ce possible ??? en 1 seule requete ???

Merci de votre aide

Fred


.









--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Avatar
Fred BROUARD
Fred a écrit:
Je viens d'essayer
ca ne marche pas !
je n'ai peut etre pas précisé qu'il s'agissait d'une base
access consultée par une page ASP en ODBC

j'ai d'abord essayé dans l'interpreteur access

access me retourne 'incohérence de type dans une
expression'

Avez vous une idée de quoi ca peut être ?



oui, que le type des données dans les colonnes, n'est pas compatible...

en effet tu met des valeurs numériques dans des colonnes de type alpha et tu
espère que cela marchera sans problème !
Imagine que tu mette du Propergol dans le réservoir de ta mobylette... Que va
t-il se passer ?

en l'occurence "rang_categorie" et "reference_categorie" est VARCHAR et tu
spécifie que :
c.rang_categorie = 2
et encore
c.reference_categorie = c2.id_categorie
il est donc impossible de faire correspondre des entiers et de la chaine de
caractères !!!

Soit tu modifie tes structures de table en faisant correspondre tes types de
données (conseillé), soit tu utilise le transtypage via CAST à tes risques et
périls.
A lire sur CAST :
http://sqlpro.developpez.com/SQL_AZ_2.html#SELECT_cast_where

Le petit conseil final : SQL est un langage informatique, très puissant... Ce
que tu faisait en bidouillant Access avec du VB tu ne peut pas le faire en SQL.
Donc, forme toi à SQL !

A +



Merci



--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************