Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
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 28/03/2011, 11h30   #1
Futur Membre du Club
 
Inscription : février 2007
Messages : 56
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 56
Points : 17
Points : 17
Par défaut Formulation de requête à partir d'une date

Bonjour,

Je ne suis pas un expert en requêtes SQL et je tourne un peu en rond.
Mon SGBD est Oracle 11gR1.

Je cherche, dans une table contenant des informations de commandes, à sortir le nombre de commandes d'un type spécifique pour chaque jour à partir d'une date donnée, pour un sous-traitant précis.

En gros je voudrais itérer cette requête:
Code :
1
2
3
4
5
6
SELECT UNIQUE(TO_CHAR(DATECMD, 'DD/MM/YYYY')) AS DATE_COMMANDE, CMD, (SELECT COUNT(*) FROM CMDSREPORT dt2 WHERE lower(dt2.CMD)='achat' AND 
      dt2.SSTRAITANT='gugus' AND
        TO_CHAR(dt2.DATECMD, 'DD/MM/YYYY') = '01/07/2010') AS NB FROM CMDSREPORT dt1 WHERE
  lower(CMD)='achat' AND
    lower(SSTRAITANT)='gugus' AND
      TO_CHAR(dt1.DATECMD, 'DD/MM/YYYY') = '01/07/2010' ;
avec comme discriminant non pas date = 01/07/2010 mais:
Code :
TO_CHAR(dt1.DATECMD, 'DD/MM/YYYY') >= '01/07/2010'
J'ai essayé de faire ça:
Code :
1
2
3
4
5
6
SELECT UNIQUE(TO_CHAR(DATECMD, 'DD/MM/YYYY')) AS DATE_COMMANDE, CMD, (SELECT COUNT(*) FROM CMDSREPORT dt2 WHERE lower(dt2.CMD)='achat' AND 
      dt2.SSTRAITANT='gugus' AND
        dt2.DATECMD = dt2.DATECMD) AS NB FROM CMDSREPORT dt1 WHERE
  lower(CMD)='achat' AND
    lower(SSTRAITANT)='gugus' AND
      TO_CHAR(dt1.DATECMD, 'DD/MM/YYYY') >= '01/07/2010' ;
mais la requête tourne infiniment et fini par planter

Si vous avez une piste à me suggérer pour obtenir le résultat recherché je vous en remercie d'avance
madmaxou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 12h32   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Je ne suis pas sûr d'avoir bien compris mais ce ne serait pas juste GROUP BY dont tu as besoin ?
Code :
1
2
3
4
5
6
SELECT DATECMD AS DATE_COMMANDE, COUNT(*) AS NB 
  FROM CMDSREPORT dt1 
 WHERE lower(CMD)='achat' 
   AND lower(SSTRAITANT)='gugus' 
   AND DATECMD >= to_date('01/07/2010','dd/mm/yyyy') 
 GROUP BY DATECMD
Sinon il ne faut pas transformer la colonne date en varchar, c'est le contraire, il faut transformer '01/07/2010' en date.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 13h29   #3
Futur Membre du Club
 
Inscription : février 2007
Messages : 56
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 56
Points : 17
Points : 17
Ha oui, merci pour le TO_DATE effectivement je pense que c'est plus logique.

Malheureusement la solution du GROUP BY pose problème car je dois ressortir des lignes type:
date | commande | nombre

J'ai une ligne par type de commande 'achat' pour le sous-traitant gugus, il peut y en avoir n par jour.

J'aimerai savoir chaque jour, combien de commande 'achat' gugus a passé à partir du 01 juillet 2010.

J'ai peur que dans ta solution le count ne s'applique qu'au global, alors que je ne veux compter que le cumule des commandes du jour, ou alors le count ne ressort qu'une ligne du fait du group by ?

Merci tout de même de ton aide
madmaxou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 13h49   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Ben le mieux c'est de tester la requête.
Sinon oui il y aura une ligne par date d'achat avec le nombre d'achat du jour (mais pas de cumul)
J'ai retiré du résultat la colonne CMD car tu filtres sur CMD='achat' mais si tu en as besoin, rajoute là dans le SELECT ET dans le GROUP BY.
Comme CMD sera constante ça ne devrait pas changer le résultat de la requête.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 14h39   #5
Futur Membre du Club
 
Inscription : février 2007
Messages : 56
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 56
Points : 17
Points : 17
Citation:
Envoyé par skuatamad Voir le message
Ben le mieux c'est de tester la requête.
Sinon oui il y aura une ligne par date d'achat avec le nombre d'achat du jour (mais pas de cumul)
J'ai retiré du résultat la colonne CMD car tu filtres sur CMD='achat' mais si tu en as besoin, rajoute là dans le SELECT ET dans le GROUP BY.
Comme CMD sera constante ça ne devrait pas changer le résultat de la requête.
J'ai bien testé la requête, effectivement j'avais du ajouter le group by CMD en plus de la date, ceci dit cela a eu l'effet que je craignais, il y a bien un groupement des dates/commandes, ce qui est positif, mais je me retrouve avec comme valeur "1" pour la partie de comptage des commandes.

C'est pour pallier à ça que j'avais ajouté une clause
Code :
WHERE dt2.DATECMD = dt1.DATECMD
dans une de mes tentatives, en essayant d'adjoindre à chaque ligne un comptage des commande de type achat pour ce sous-traitant correspondant à la journée en cours, mais sans succès.

Peut-être n'est pas possible dans une seule requête ?
madmaxou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 14h44   #6
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 445
Points : 10 445
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Il suffit d'utiliser la fonction de fenêtrage au lieu de l'agrégat :
Code :
1
2
3
4
5
6
SELECT datecmd AS date_commande, cmd, sstraitant,
       count(*) over(partition BY trunc(datecmd)) AS nb 
  FROM cmdsreport 
 WHERE lower(cmd) = 'achat' 
   AND lower(sstraitant) = 'gugus' 
   AND datecmd >= to_date('01/07/2010','dd/mm/yyyy');
Si vous voulez exécuter votre requête sur plusieurs commandes / fournisseurs :
Code :
1
2
3
4
SELECT datecmd AS date_commande, cmd, sstraitant,
       count(*) over(partition BY trunc(datecmd), cmd, sstraitant) AS nb 
  FROM cmdsreport 
 WHERE datecmd >= to_date('01/07/2010','dd/mm/yyyy');
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 15h03   #7
Futur Membre du Club
 
Inscription : février 2007
Messages : 56
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 56
Points : 17
Points : 17
Wahou, je ne connaissais pas, c'est super, tout à fait ce que je cherchais à obtenir !!

Merci beaucoup
madmaxou 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 23h44.


 
 
 
 
Partenaires

Hébergement Web