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

SQL Oracle Discussion :

Aide analyse compréhention rédaction requête SQL


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2016
    Messages : 11
    Par défaut Aide analyse compréhention rédaction requête SQL
    Bonjour,

    Je cherche de l'aide pour comprendre une requête SQL Oracle.

    Mon objectif principal est d'avoir la somme par utilisateur (user_id) du nombre qui se trouve dans la colonne "nbr_units" avec les 2 leviers, valeur TRAN_TYPE 100 et 600.
    La requête que je joins sort des valeurs trop élevées en comparaison de la réalité, du coup je dois comprendre et voir ou cela déconne.
    Pouvez-vous m'aider à résoudre ce problème

    TRAN_TYPE = VARCHAR2 (3 CHAR)
    TRAN_NBR = NUMBER (9, 0)
    NBR_UNITS = NUMBER (13, 5)

    S'ajoute à ce problème que je n'obtiens pas de résulta quand dans mon SELECT * FROM PROD_TRKG_TRAN WHERE TRAN_TYPE = 100 AND TRAN_TYPE = 600. Mais je le fais séparément j'obtiens des données ! Il doit y avoir une subtilité que je ne connais pas.

    Première question : Je comprend pas pourquoi l'utilisation d'un "LEFT JOIN". Si je suis bien renseigné, cela permet de retourner le nombre de caractère.
    Deuxième question : Le SUM(CASE WHENE ...) il compare la valeur qui est un ID unique. Comment il obtient la somme de "NBR_UNITS" par TRAN_TYPE pour l'utilisateur XX

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select  ptt.user_id as "OPERATEUR", '1 - Pièces Recues' as "ETAPE",
    sum(case when ptt2.tran_nbr is not null then ptt2.nbr_units else ptt.nbr_units end) as "Nbr" 
    from prod_trkg_tran ptt
    left join (select * from prod_trkg_tran ptt2 where tran_type =600 and  trunc(create_date_time) = trunc(sysdate)) ptt2 on ptt2.cntr_nbr = ptt.cntr_nbr and rownum = 1
    where ptt.tran_type =100 and  trunc(ptt.create_date_time) = trunc(sysdate)
    group by ptt.user_id

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Citation Envoyé par matmat94 Voir le message
    S'ajoute à ce problème que je n'obtiens pas de résulta quand dans mon SELECT * FROM PROD_TRKG_TRAN WHERE TRAN_TYPE = 100 AND TRAN_TYPE = 600. Mais je le fais séparément j'obtiens des données ! Il doit y avoir une subtilité que je ne connais pas.
    Quand tu exécutes la requête SELECT * FROM PROD_TRKG_TRAN WHERE TRAN_TYPE = 100 AND TRAN_TYPE = 600 tu recherches les lignes qui ont simultanément la valeur 100 et la valeur 600 dans leur colonne TRAN_TYPE, ce qui n'est pas possible.
    Il faut rechercher les lignes qui possèdent l'une de ces deux valeurs donc : SELECT * FROM PROD_TRKG_TRAN WHERE TRAN_TYPE = 100 OR TRAN_TYPE = 600 ou mieux encore SELECT * FROM PROD_TRKG_TRAN WHERE TRAN_TYPE IN (100, 600)
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Essayez ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      select user_id
           , coalesce( sum(case tran_type when 100 then nbr_units end)
                     , sum(case tran_type when 600 then nbr_units end)
                     ) as nbr_units
        from prod_trkg_tran
       where create_date_time >= trunc(sysdate)
         and create_date_time <  trunc(sysdate) + 1
         and tran_type        in (100, 600)
    group by user_id;

  4. #4
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2016
    Messages : 11
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Bonjour Waldar,

    Merci pour ta réponse,
    J'ai essayé ta requête et j'obtiens un message d'erreur.

    ORA-00932: types de données incohérents ; attendu : CHAR ; obtenu : NUMBER
    00932. 00000 - "inconsistent datatypes: expected %s got %s"
    Quel est la fonction coalesce ?

    Encore merci pour ton aide.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 001
    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 : 22 001
    Billets dans le blog
    6
    Par défaut
    SQL est un langage typé avec transtypage automatique.

    Vous avez une colonne tran_type en VARCHAR (donc des littéraux) et vous voulez en comparer la valeur avec 100 qui est un nombre.
    Le moteur SQL obéit à votre demande et doit donc transtyper toutes les valeurs contenues dans la colonne tran_type en nombre pour effectuer cette comparaison. D'où votre message d'erreur s'il tombe sur un littéral qui n'est pas transtypable.

    Si vous aviez écrit votre requête comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select user_id
           , coalesce( sum(case tran_type when '100' then nbr_units end)
                     , sum(case tran_type when '600' then nbr_units end)
                     ) as nbr_units
        from prod_trkg_tran
       where create_date_time >= trunc(sysdate)
         and create_date_time <  trunc(sysdate) + 1
         and tran_type        in ('100', '600')
    group by user_id;

    Vous n'auriez pas eu cette erreur.

    Apprenez le SQL !
    Mes livres, comme mon site web peuvent vous y aider
    https://SQLpro.developpez.com

    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/ * * * * *

  6. #6
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2016
    Messages : 11
    Par défaut
    Bonjour à tous,

    Merci pour votre car cela m'a bien aidé et permis d'aller au but.

    Pour info, SQLpro ta correction fonctionne parfaitement.
    Cependant, je comprend que SQL est autonome sur le transtypage, c'est bien ça ?

    Je n'est pas trouvé de documentation sur la fonction COALESCE, si vous avez un lien à me donner ca serait super cool.

    Comme WALDAR et SQLpro m'ont fournit une réponse correspondant à ce que je souhaite je vais me permettre de mettre en résolut la discutions.

    Je remercie encore les personnes ayant participé à la conversation et à la communauté pour votre aide.

    Matthieu

  7. #7
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2016
    Messages : 11
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Quand tu exécutes la requête SELECT * FROM PROD_TRKG_TRAN WHERE TRAN_TYPE = 100 AND TRAN_TYPE = 600 tu recherches les lignes qui ont simultanément la valeur 100 et la valeur 600 dans leur colonne TRAN_TYPE, ce qui n'est pas possible.
    Il faut rechercher les lignes qui possèdent l'une de ces deux valeurs donc : SELECT * FROM PROD_TRKG_TRAN WHERE TRAN_TYPE = 100 OR TRAN_TYPE = 600 ou mieux encore SELECT * FROM PROD_TRKG_TRAN WHERE TRAN_TYPE IN (100, 600)
    Bonjour Al1,

    MErci pour ta réponse, je comprend mieux pourquoi je n'avais pas de donné en retour.
    Grace à ton aide j'ai pu, enfin je pense avoir un résultat différent que de celui de la requête initial.
    Mais je ne sais pas si elle est en phase avec la réalité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT user_id, count (nbr_units) 
    FROM PROD_TRKG_TRAN 
    WHERE TRAN_TYPE IN (100, 600) and  trunc(create_date_time) = trunc(sysdate)
    group by user_id

Discussions similaires

  1. Besoin d'aide pour écrire une requête SQL
    Par tompintures dans le forum Requêtes
    Réponses: 2
    Dernier message: 31/01/2011, 10h47
  2. DAO_Filter aide à la création de requête SQL
    Par cahnory dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 4
    Dernier message: 27/05/2010, 11h31
  3. Aide pour formuler une requête sql
    Par viny dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 23/05/2008, 20h37
  4. Aide pour construire une requête SQL
    Par squalito dans le forum Oracle
    Réponses: 1
    Dernier message: 09/03/2007, 15h04
  5. Aide pour construire une requête SQL
    Par squalito dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/03/2007, 14h08

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