IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Problème requête avec CASE


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Octobre 2017
    Messages : 53
    Par défaut Problème requête avec CASE
    Bonjour,

    Je me permets de vous solliciter car je suis totalement rouillée en sql

    Je suis entrain de me prendre la tête sur une requête, dont je n'arrive pas à avoir le résultat souhaité

    Le résultat que je voudrais avoir est le suivant :

    Date Témoin A Témoin B Total
    28/09/2020 3 4 7

    Le total je le calcul dans le reste de mon script qui est en awk

    Mais actuellement j'ai cela :

    28/09/20 A 1
    28/09/20 A 1
    28/09/20 B 1
    28/09/20 A 1
    28/09/20 B 2
    28/09/20 B 1

    Pour cela voici la requête que j'ai essayé de mettre en place
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select  dat_cre as date_crea, dat_mod as date_modif, tem_ori as ori, COUNT(
      CASE 
        WHEN dat_mod is null then dat_cre
        WHEN dat_mod > dat_cre_iae then dat_mod
      ELSE
        sysdate
       END)
       from ins_adm_etp
       WHERE cod_anu=(select cod_anu from ANNEE_UNI where eta_anu_iae='O')
        AND eta='E'
        AND ETA_PMT='P'
        AND tem_ori not null
       GROUP BY dat_cre, dat_mod , tem_ori;
    Petite remarque, je peux avoir 2 dates dat_cre et dat_mod et je voudrais prendre la plus grande soit celle de dernière modification

    Exemple:

    27/09/20 16/10/20 A 1

    Dans cette exemple il faudrait que je prendre la date la plus récente soit le 16/10/2020

    Je vous remercie à tous de votre aide.

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 175
    Par défaut
    Bonjour,

    Ce serait plus qqch comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT GREATEST(dat_cre, dat_mod) as date_maj,
           COUNT(case when tem_ori = 'A' then 1 end) as temoin_A,
           COUNT(case when tem_ori = 'B' then 1 end) as temoin_B,
           COUNT(*) as total
    FROM  ins_adm_etp 
    WHERE cod_anu=(select a.cod_anu from ANNEE_UNI a where a.eta_anu_iae='O')
      AND eta='E'
      AND ETA_PMT='P'
      AND tem_ori not null
    GROUP BY GREATEST(dat_cre, dat_mod);
    Car dans ton case les conditions feront qu'on comptera toujours quelque chose de non null.

  3. #3
    Membre confirmé
    Femme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Octobre 2017
    Messages : 53
    Par défaut
    Bonjour Vanagreg,

    Je te remercie pour ta réponse, je ne connaissais pas GREATEST
    Je vais abuser de ta gentillesse, mais quand j'exécute la requête je n'arrive pas à avoir le résultat souhaité qui serait :

    Date Témoin A Témoin B Total
    01/07/20 2 16 18

    Alors que j'ai

    Date Témoin A Témoin B Total
    01/07/20 0 1 1
    01/07/20 0 1 1
    01/07/20 0 1 1
    01/07/20 0 1 1
    01/07/20 0 1 1
    01/07/20 0 1 1
    01/07/20 0 1 1
    01/07/20 0 1 1
    01/07/20 0 1 1
    01/07/20 0 2 2
    01/07/20 0 1 1
    01/07/20 0 1 1
    01/07/20 1 0 1
    01/07/20 0 1 1
    01/07/20 0 1 1
    01/07/20 0 1 1
    01/07/20 1 0 1

    Aurais-tu une idée d'où pourrais provenir le problème ?

    Merci par avance de ton aide.

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 175
    Par défaut
    A première vue je dirais que c'est parce que les dates ont une partie horaire mais ton logiciel n'affiche que la partie date. Si ce n'est que cette dernière qui t'intéresse, alors tu peux tronquer les dates:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT TRUNC(GREATEST(dat_cre, dat_mod)) as date_maj,
           COUNT(case when tem_ori = 'A' then 1 end) as temoin_A,
           COUNT(case when tem_ori = 'B' then 1 end) as temoin_B,
           COUNT(*) as total
    FROM  ins_adm_etp 
    WHERE cod_anu=(select a.cod_anu from ANNEE_UNI a where a.eta_anu_iae='O')
      AND eta='E'
      AND ETA_PMT='P'
      AND tem_ori not null
    GROUP BY TRUNC(GREATEST(dat_cre, dat_mod));

  5. #5
    Membre confirmé
    Femme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Octobre 2017
    Messages : 53
    Par défaut
    Oui cela marche mieux super merci
    Juste dernière remarque cette nouvelle version de ma requête me fait perdre des données

    En effet ma requête initiale que j'utilise depuis plusieurs années,
    Résultat requête initiale :

    A 2411
    B 3044

    Tandis que maintenant le résultat:

    Témoin A Témoin B Total
    1367 2464 3831

    Je pense que le problème vient au niveau des dates car dans ma base j'ai des dossiers qui ne sont pas forcément modifié et donc ou je dois garder ma dat_crea
    Faut-il que je rajoute une clause CASE pour que cela soit pris en compte ?

    Merci par avance de ton aide.

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 175
    Par défaut
    Ok, peut-être dû aux dates null en effet. Il faut ajouter un NVL:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT TRUNC(GREATEST(dat_cre, nvl(dat_mod, dat_cre))) as date_maj,
           COUNT(case when tem_ori = 'A' then 1 end) as temoin_A,
           COUNT(case when tem_ori = 'B' then 1 end) as temoin_B,
           COUNT(*) as total
    FROM  ins_adm_etp 
    WHERE cod_anu=(select a.cod_anu from ANNEE_UNI a where a.eta_anu_iae='O')
      AND eta='E'
      AND ETA_PMT='P'
      AND tem_ori not null
    GROUP BY TRUNC(GREATEST(dat_cre, nvl(dat_mod, dat_cre)));

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    A première vue je dirais que c'est parce que les dates ont une partie horaire mais ton logiciel n'affiche que la partie date. Si ce n'est que cette dernière qui t'intéresse, alors tu peux tronquer les dates:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT TRUNC(GREATEST...);
    GREATEST n'existe pas en SQL !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème requête avec INSTR()
    Par yohan0262 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 13/06/2007, 10h20
  2. Problème requête avec access
    Par celiaaa dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 29/05/2007, 12h40
  3. Problème requête avec 2 conditions
    Par omgirl dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 12/07/2006, 16h19
  4. Problème requête avec group by et distinct
    Par tomca dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/07/2005, 16h10
  5. Problème requête avec UNION et ORDER BY
    Par Yann21 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/12/2003, 11h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo