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 :

Logique d'une requête


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Logique d'une requête
    Bonsoir à tous,
    Je suis confronté à un problème que voici.
    Etant donné les enregistrements suivants:

    col1            col2        col3                    col4
    -----           -----        ----                    ----
    41A00170	   1	      806,11	  	         0
    70620000	   1	      0		               1422
    41A00170	   1	       1422	                  0
    41100029	   1	       377,11	           0
    70620000	   1	          0	              287,63
    44571700	   1	          0	              377,11
    44571700	   1	          0	              806,11
    41100029	   1	       287,63	           0
    
    Je dois pouvoir les lettrer dans la colonne "col2" de la façon suivante:
    col1            col2        col3                    col4
    -----           -----        ----                    ----
    41A00170	   1	      806,11	       	    0
    70620000	   1	         0	               1422
    41A00170	   1	       1422	                   0
    41100029	   2	       377,11	           0
    70620000	   2	          0	              287,63
    44571700	   2	          0	              377,11
    44571700	   1	          0	              806,11
    41100029	   2	       287,63	           0
    
    En gros, les lignes dont la colonne col1 contient les mêmes valeurs commençant par 41 doivent avoir en col2 une même référence numérique (en l'espèce "1" pour toutes les col1= 41A00170 et "2" pour toutes les col1 = 41100029)

    Ensuite je dois chercher en col3 le montant indiqué et trouver la ligne dont la valeur en col4 est égale à la valeur de la colonne col3 dans la ligne pré-citée.

    Donc pour la valeur 41A00170 en col1 à laquelle j'ai attribué "1" en col2, je vois que sa col3 est égal à 806,11. Je vois que la valeur correspondante à 806,11 en col4 est dans l'avant dernière ligne de la table.
    Donc j'attribue "1" à la col2 de cette ligne. Et ainsi de suite sachant que la table peut-être beaucoup plus longue...

    Merci de vos lumières!

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 345
    Points : 39 743
    Points
    39 743
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Si votre SGBD le permet (quel est il ?), utilisez la fonction fenêtrée ROW_NUMBER pour déterminer le nombre d'occurrences pour chaque valeur de la colonne 1, puis récupérez la valeur max que vous attribuerez en colonne 2

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Il s'agit de sql server...
    merci

    Citation Envoyé par escartefigue Voir le message
    Bonjour,

    Si votre SGBD le permet (quel est il ?), utilisez la fonction fenêtrée ROW_NUMBER pour déterminer le nombre d'occurrences pour chaque valeur de la colonne 1, puis récupérez la valeur max que vous attribuerez en colonne 2

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 345
    Points : 39 743
    Points
    39 743
    Billets dans le blog
    9
    Par défaut
    Plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select T1.col1                    
         , T2.nbr                     
         , T1.col3                    
         , T1.col4                    
    from       matable  as T1                
    inner join                        
         (select col1                 
               , count(*) as nbr      
          from matable                   
          group by col1) as T2        
       on T2.col1=T1.col1             
     
     ;

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci
    Si j'applique ta méthode, il me semble que ça ne marche pas car je ne cherche pas à compte le nombre d'occurrences pour chaque col1 mais bien à les grouper de façon à avoir une référence unique par colonnes col1 identiques...

    Citation Envoyé par escartefigue Voir le message
    Plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select T1.col1                    
         , T2.nbr                     
         , T1.col3                    
         , T1.col4                    
    from       matable  as T1                
    inner join                        
         (select col1                 
               , count(*) as nbr      
          from matable                   
          group by col1) as T2        
       on T2.col1=T1.col1             
     
     ;

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Et en utilisant dense_rank comme ceci j'arrive à qq chose de mieux mais je dois trouver la solution au reste du problème :-(

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT
           [colo1]
          ,dense_rank() over(ORDER BY [col1] asc) as np
     
      FROM matable
      where [col1] like '41%'
    ORDER BY	np

    Citation Envoyé par altgor Voir le message
    Merci
    Si j'applique ta méthode, il me semble que ça ne marche pas car je ne cherche pas à compte le nombre d'occurrences pour chaque col1 mais bien à les grouper de façon à avoir une référence unique par colonnes col1 identiques...

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 345
    Points : 39 743
    Points
    39 743
    Billets dans le blog
    9
    Par défaut
    Le truc c'est que je n'arrive pas à comprendre le résultat final attendu, un exemple serait le bienvenu

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Quelque chose de ce type-là, mais vous aurez probablement de nombreux cas de figures à gérer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    with cte_tmp (col1, col2, col3, col4) as
    (
    select col1
         , case left(col1, 2) when '41' then dense_rank() over (partition by left(col1, 2) order by col1 desc) end as col2
         , col3
         , col4
      from matable
    )
        select t1.col1
             , coalesce(t1.col2, t2.col2) as col2
             , t1.col3
             , t1.col4
          from cte_tmp as t1
     left join cte_tmp as t2  on t2.col3 = t1.col4
                             and t1.col4 > 0;
     
        col1  col2     col3     col4
    --------  ----  -------  -------
    41A00170     1   806.11     0.00
    70620000     1     0.00  1422.00
    41A00170     1  1422.00     0.00
    41100029     2   377.11     0.00
    70620000     2     0.00   287.63
    44571700     2     0.00   377.11
    44571700     1     0.00   806.11
    41100029     2   287.63     0.00

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bravo, ça a l'air parfait !
    merci!!!

    Citation Envoyé par Waldar Voir le message
    Quelque chose de ce type-là, mais vous aurez probablement de nombreux cas de figures à gérer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    with cte_tmp (col1, col2, col3, col4) as
    (
    select col1
         , case left(col1, 2) when '41' then dense_rank() over (partition by left(col1, 2) order by col1 desc) end as col2
         , col3
         , col4
      from matable
    )
        select t1.col1
             , coalesce(t1.col2, t2.col2) as col2
             , t1.col3
             , t1.col4
          from cte_tmp as t1
     left join cte_tmp as t2  on t2.col3 = t1.col4
                             and t1.col4 > 0;
     
        col1  col2     col3     col4
    --------  ----  -------  -------
    41A00170     1   806.11     0.00
    70620000     1     0.00  1422.00
    41A00170     1  1422.00     0.00
    41100029     2   377.11     0.00
    70620000     2     0.00   287.63
    44571700     2     0.00   377.11
    44571700     1     0.00   806.11
    41100029     2   287.63     0.00

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 345
    Points : 39 743
    Points
    39 743
    Billets dans le blog
    9
    Par défaut
    et surtout félicitations pour avoir compris le besoin

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Il fallait décoder cette phrase qui indiquait un peu maladroitement une jointure entre col3 et col4 pour propager la valeur calculée en col2 :
    Citation Envoyé par altgor Voir le message
    Donc pour la valeur 41A00170 en col1 à laquelle j'ai attribué "1" en col2, je vois que sa col3 est égal à 806,11. Je vois que la valeur correspondante à 806,11 en col4 est dans l'avant dernière ligne de la table.
    Donc j'attribue "1" à la col2 de cette ligne.

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

Discussions similaires

  1. [2008R2] Logique pour une requête de type Slope
    Par lepotier dans le forum Développement
    Réponses: 0
    Dernier message: 24/11/2014, 12h00
  2. Logique sur une requête MySQL
    Par Leduc08 dans le forum Requêtes
    Réponses: 7
    Dernier message: 12/02/2013, 16h08
  3. Condition logique sur une requête
    Par NiKoS29 dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 25/07/2007, 15h40
  4. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  5. [BDD] Enregistrer le résultat d'une requête
    Par Mowgly dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/06/2002, 15h26

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