Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
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 08/05/2011, 23h02   #1
Nouveau Membre du Club
 
Inscription : janvier 2011
Messages : 145
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 145
Points : 25
Points : 25
Par défaut " select top1 " sur un seul parametre

Bonsoir

Je dois sélectionner l'année ou il y a eu le plus visite , grouper le nombre de visite par trimestre pour un résultat comme suit :

année / trimestre / nombre de de visites

Code sql :
1
2
3
4
5
6
SELECT YEAR(datevisite) AS annee  , DATEPART('q',datevisite) AS trimestre, COUNT(numvis) AS nombrevisite 
FROM  ( SELECT  TOP 1 YEAR(datevisite) AS annee  
            FROM ( SELECT COUNT(numvis) AS nombrevisite 
                         FROM ( SELECT DATEPART('q',datevisite) AS trimestre 
                                    FROM VISITE
                                    GROUP BY YEAR(datevisite) ,  DATEPART('q',datevisite) ) ) )  ;

Problème avec un sélection imbriqué ça ne marche pas et je ne vois pas l'erreur .

Merci d'avance
tanaka59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 00h30   #2
Rédacteur

 
Avatar de Maxence HUBICHE
 
Homme Maxence HUBICHE
Formateur et Développeur - Conseil en Informatique
Inscription : juin 2002
Messages : 3 687
Détails du profil
Informations personnelles :
Nom : Homme Maxence HUBICHE
Âge : 42
Localisation : France, Val d'Oise (Île de France)

Informations professionnelles :
Activité : Formateur et Développeur - Conseil en Informatique

Informations forums :
Inscription : juin 2002
Messages : 3 687
Points : 6 516
Points : 6 516
Envoyer un message via MSN à Maxence HUBICHE Envoyer un message via Skype™ à Maxence HUBICHE
Ca ne marche pas parce que tes sous-requêtes ne renvoient pas les champs dont tu te sers pour les requêtes de niveau supérieur !

par exemple
Code :
1
2
3
4
5
6
1=>> SELECT COUNT(numvis) AS nombrevisite 
                         FROM ( 
2=>> SELECT DATEPART('q',datevisite) AS trimestre 
                                    FROM VISITE
                                    GROUP BY YEAR(datevisite) ,  DATEPART('q',datevisite) )
Dans ta requête marquée 2=>> tu ne renvoies qu'un seul champ (trimestre)
Dans ta requête marquée 1=>> tu utilise un champ (numvis) qui n'est pas celui qui est renvoyé par ta requête. Alors, comment veux-tu qu'il fasse ?
__________________
1formaxion, une formation de qualité, des formateurs compétents
Mes tutoriels et vidéos :
Tableaux croisés dynamiques, Access les Bases, et les autres !
Maxence HUBICHE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 16h53   #3
Nouveau Membre du Club
 
Inscription : janvier 2011
Messages : 145
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 145
Points : 25
Points : 25
Bonsoir

J'ai reessayer ceci :

Code sql :
1
2
3
4
5
6
7
SELECT YEAR(datevisite) AS annee  , DATEPART('q',datevisite) AS trimestre, COUNT(numvis) AS nombrevisite 
FROM VISITE 
WHERE YEAR (datevisite ) =( SELECT TOP 1 YEAR(datevisite) AS année_avec_plus_de_visites
                                               FROM VISITE
                                               GROUP BY YEAR(datevisite)
                                                HAVING COUNT (numvis) ) 
GROUP BY YEAR(datevisite) , DATEPART('q',datevisite) ;

J'espere que c'est le bon

Merci d'avance
tanaka59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 17h37   #4
Rédacteur

 
Avatar de Maxence HUBICHE
 
Homme Maxence HUBICHE
Formateur et Développeur - Conseil en Informatique
Inscription : juin 2002
Messages : 3 687
Détails du profil
Informations personnelles :
Nom : Homme Maxence HUBICHE
Âge : 42
Localisation : France, Val d'Oise (Île de France)

Informations professionnelles :
Activité : Formateur et Développeur - Conseil en Informatique

Informations forums :
Inscription : juin 2002
Messages : 3 687
Points : 6 516
Points : 6 516
Envoyer un message via MSN à Maxence HUBICHE Envoyer un message via Skype™ à Maxence HUBICHE
ben... non, je ne pense pas...
Ta clause HAVING ne veut pas dire grand-chose !
Tu as essayé pour voir ?
__________________
1formaxion, une formation de qualité, des formateurs compétents
Mes tutoriels et vidéos :
Tableaux croisés dynamiques, Access les Bases, et les autres !
Maxence HUBICHE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 22h04   #5
Nouveau Membre du Club
 
Inscription : janvier 2011
Messages : 145
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 145
Points : 25
Points : 25
Par défaut suppression dans table par comptage dans une autre

Bonsoir

Je dois supprimer dans une table , en comptant dans une autre et en faisant 2 calcule dans cette seconde table sur une même colonne.

Pour relier mes deux tables j'ai une clef numclient (primaire pour CLIENT et étrangère pour ANIMAL)

Dans ANIMAL il y a une casse decede qui me permet de savoir si un animal et mort ou non . YES/NO comme type

Je dois ensuite faire un comptage du nombre d'animaux par client et refaire un comptage du nombre d'animaux mort pour chaque client.

Si le nombre d'animaux mort de chaque client et le même que le nombre total d'animaux comptés alors je supprime le client de la base.

J'ai testé ceci :

Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
DELETE CLIENT.typelient , CLIENT.numclient , CLIENT.nomclient , CLIENT.rue ,CLIENT.localite , CLIENT.departement , CLIENT.codepostal , CLIENT.telephone , CLIENT.siteweb , CLIENT.clientdepuis , CLIENT.remise , CLIENT.balance 
FROM CLIENT , ANIMAL INNER JOIN ANIMAL AS ANIMAL_1 ON ANIMAL.numclient=ANIMAL_1.numclient 
WHERE (((ANIMAL_1.numclient)>[ANIMAL].[numclient]))
AND (SELECT COUNT(ANIMAL.numclient) AS nombre_animaux_decede  
          FROM ANIMAL
           WHERE decede=YES
           GROUP BY numclient
            HAVING COUNT(ANIMAL.numclient) )  = 
           ( SELECT COUNT(ANIMAL_1.numclient) AS nombre_animaux , numclient
           FROM ANIMAL
           GROUP BY numclient
           HAVING COUNT(ANIMAL_1.numclient) )  
GROUP BY CLIENT.numclient;

Pour me permettre de faire une calcule sur la même colonne j'ai fait un inner join en auto jointure en créant virtuellement une seconde table ANIMAL. Il me parle d'une clause EXISTS dans FROM ?

Mais ca n'a pas l'air de marché alors j'ai testé ceci :

Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
DELETE CLIENT.typelient , CLIENT.numclient, CLIENT.nomclient , CLIENT.rue ,CLIENT.localite , CLIENT.departement , CLIENT.codepostal , CLIENT.telephone , CLIENT.siteweb , CLIENT.clientdepuis , CLIENT.remise , CLIENT.balance 
FROM CLIENT  
WHERE (SELECT COUNT(ANIMAL.numclient) AS nombre_animaux_decede  
          FROM ANIMAL
           WHERE decede=YES
           GROUP BY ANIMAL.numclient
            HAVING COUNT(ANIMAL.numclient) )  = 
           ( SELECT COUNT(ANIMAL_1.numclient) AS nombre_animaux 
           FROM ANIMAL INNER JOIN ANIMAL AS ANIMAL_1 ON ANIMAL.numclient=ANIMAL_1.numclient
          WHERE ((ANIMAL_1.numclient)>[ANIMAL].[numclient]) 
           GROUP BY ANIMAL.numclient
           HAVING COUNT(ANIMAL_1.numclient) ) ;

Ici non plus rien

Merci d'avance
tanaka59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 22h20   #6
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 412
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 412
Points : 4 442
Points : 4 442
bonsoir,

Citation:
Envoyé par tanaka59 Voir le message
...Si le nombre d'animaux mort de chaque client et le même que le nombre total d'animaux comptés alors je supprime le client de la base.
Ce serait peut-être plus simple de commencer par chercher les clients qui ont au moins un animal vivant, non ? (puis de supprimer les autres)
f-leb est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 23h02   #7
Nouveau Membre du Club
 
Inscription : janvier 2011
Messages : 145
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 145
Points : 25
Points : 25
Le comptage que tu proposes , c'est a dire ?

J'ai encore essayé 5 solutions différentes , toujours rien qui marche
tanaka59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 23h54   #8
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 412
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 412
Points : 4 442
Points : 4 442
il faut décomposer ton problème...

1°) Produire la liste des clients à conserver (ceux qui ont au moins un animal vivant + éventuellement ceux qui n'ont pas d'animaux du tout)
2°) Avec une requête de non-correspondance, produire la liste des clients qui ne sont pas dans la liste 1°) et les supprimer.

Citation:
...ceux qui ont au moins un animal vivant...
Code sql :
SELECT DISTINCT NumClient FROM ANIMAL WHERE NOT(Decede);
f-leb est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 13h48   #9
Nouveau Membre du Club
 
Inscription : janvier 2011
Messages : 145
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 145
Points : 25
Points : 25
Bonjour

C'est bon ça marche , j'ai décortiqué en 4 requêtes distinct dont une qui appelle les 3 autres .

Par coutre je suis embetté pour une chose .

Si je supprime un client qui à un numéros en clef primaire . Problème je me retrouve avec le même dit numéros en clef étrangère dans une autre table sans référencement de ça clef primaire .

Dois je donc aussi supprimer la clef étrangère ?

Merci d'avance
tanaka59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 17h18   #10
Rédacteur

 
Avatar de Maxence HUBICHE
 
Homme Maxence HUBICHE
Formateur et Développeur - Conseil en Informatique
Inscription : juin 2002
Messages : 3 687
Détails du profil
Informations personnelles :
Nom : Homme Maxence HUBICHE
Âge : 42
Localisation : France, Val d'Oise (Île de France)

Informations professionnelles :
Activité : Formateur et Développeur - Conseil en Informatique

Informations forums :
Inscription : juin 2002
Messages : 3 687
Points : 6 516
Points : 6 516
Envoyer un message via MSN à Maxence HUBICHE Envoyer un message via Skype™ à Maxence HUBICHE
Eh bien, si tu supprimes effectivement ton client, tu peux utiliser l'intégrité référentielle pour supprimer en cascade les enregistrements joints dans les tables découlant (liées) à ton Identifiant Client.

Pour ce faire, tu vas dans la fenêtre des relations [Outils/relations]
Tu affiches toutes les relations (il y a un bouton pour ça)
Tu t'assures qu'il y a une relation existante entre tes clients et l'autre table. Si ce n'est pas le cas tu la crée.
Dans la fenêtre des relations, tu coches [Appliquer l'intégrité référentielle] ainsi que la case [Effacer en cascade]

Pour que cela marche il faudra respecter quelques règles :
1- La clé primaire et la clé étrangère devront avoir mêmes types de données et taille
2- Il ne devra pas y avoir, dans la clé étrangère, de données qui n'existent pas dans la clé primaire
3- Ta relation devra être faite entre la clé primaire et la clé étrangère (mais je pense que ceci était évident, au vu des points précédents)

voilà
__________________
1formaxion, une formation de qualité, des formateurs compétents
Mes tutoriels et vidéos :
Tableaux croisés dynamiques, Access les Bases, et les autres !
Maxence HUBICHE est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h57.


 
 
 
 
Partenaires

Hébergement Web