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

Requêtes MySQL Discussion :

Blocage sur requête SQL Somme pour un client sélectionné


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Homme Profil pro
    Developpeur
    Inscrit en
    Novembre 2011
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 196
    Points : 159
    Points
    159
    Par défaut Blocage sur requête SQL Somme pour un client sélectionné
    Bonjour à toutes et à tous,

    Je suis bloqué sur une requete sql

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	   public function with_totalttc()
        {
            $this->filter_select('IFnull((SELECT SUM(old_ttc) FROM ip_client_olds WHERE client_id IN (SELECT client_id FROM ip_client_olds WHERE ip_client_olds.client_id = ip_clients.client_id)), 0) AS oldttc', false);
     
    	   return $this;
        }
    Je cherche à faire la somme de ma colonne "old" ttc dans ma table "ip_client_olds" avec pour resultat la somme de tous les "old_ttc" de mon clie,nt sélectionné.

    Pouvez vous m'aider ?

    Merci par avance

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 893
    Points
    38 893
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Faites comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      SELECT coalesce(SUM(old_ttc), 0) 
      FROM ip_client_olds T0
      WHERE exists
           (SELECT 1
            FROM ip_client T1
            WHERE T1.client_id = T0.client_id)
    EDIT : j'ai supposé que vous vouliez vérifier l'existence non pas dans client_olds mais dans client, j'ai donc corrigé en ce sens (cf. votre requete imbriquée)

  3. #3
    Membre habitué
    Homme Profil pro
    Developpeur
    Inscrit en
    Novembre 2011
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 196
    Points : 159
    Points
    159
    Par défaut
    Bonjour,

    Un grand merci pour votre aide.
    Le code SQL fonctionne à merveille, je n'ai pas encore l'affichage sur ma page php mais j'y travail.
    J'avance à grands pas, merci encore.
    Je joindrai le code avec l'affichage une fois que j'aurai trouver la petite mouche qui me bloque

  4. #4
    Membre habitué
    Homme Profil pro
    Developpeur
    Inscrit en
    Novembre 2011
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 196
    Points : 159
    Points
    159
    Par défaut
    Rebonjour,

    J'ai passé mon AM a trouver la solution pour afficher.

    Le code sql qui fonctionne est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT coalesce(SUM(old_ttc) , 0) as ttca FROM ip_client_olds T0 WHERE exists (SELECT 1 FROM ip_clients T1 WHERE T1.client_id = T0.client_id)
    Mon code php pour ma fonction est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     public function with_total_old()
        {
            $this->filter_select('IFnull((SELECT coalesce(SUM(old_ttc) , 0) as ttca FROM ip_client_olds T0 WHERE exists (SELECT 1 FROM ip_clients T1 WHERE T1.client_id = T0.client_id)', false);
            return $this;
        }
    Pour afficher mon résultat j'utilise ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <?php echo format_currency($client->ttca); ?>
    Je ne comprends pas mon erreur.

    Pouvez vous m’éclaircir et m'expliquer ?

    Merci par avance

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 893
    Points
    38 893
    Billets dans le blog
    9
    Par défaut
    La requête ne renverra pas de null, car la fonction coalesce(colx, valy) remplace justement la valeur de la colonne colx par la valeur valy si colx est nulle.
    Donc dans ce cas précis par zéro.

    Pour les questions PHP par contre, il faut poster dans la section consacrée

  6. #6
    Membre habitué
    Homme Profil pro
    Developpeur
    Inscrit en
    Novembre 2011
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 196
    Points : 159
    Points
    159
    Par défaut
    Merci pour ta réponse, le problème c'est qu'elle me renvoi toujours 0.
    La discussion a déjà été déplacée par 1 modérateur, je ne veux pas me faire taper sur les doigts

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 893
    Points
    38 893
    Billets dans le blog
    9
    Par défaut
    S'il y a toujours zéro c'est que le test d'existence renvoie "faux", il n'y a donc aucun id_client de la table client_olds présent dans la table client

  8. #8
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 384
    Points : 19 073
    Points
    19 073
    Par défaut
    Salut sdispro.

    Citation Envoyé par sdispro
    Je cherche à faire la somme de ma colonne "old" ttc dans ma table "ip_client_olds" avec pour résultat la somme de tous les "old_ttc" de mon client sélectionné.
    Votre demande n'est pas très compliqué à faire !

    Il y a une erreur de nom de table dans votre requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT  SUM(old_ttc)
      FROM  ip_client_olds
     WHERE  client_id IN (SELECT  client_id 
                            FROM  ip_client_olds
                           WHERE  ip_client_olds.client_id = ip_clients.client_id);
    Faire une jointure sur la même table, surtout dans votre cas, ne sert strictement à rien.

    Citation Envoyé par Escartefigue
    EDIT : j'ai supposé que vous vouliez vérifier l'existence non pas dans client_olds mais dans client, j'ai donc corrigé en ce sens (cf. votre requete imbriquée)
    Oui, je suppose que l'erreur vient de la confusion entre ces deux tables.

    On part sur le fait qu'il existe une autre table mère de nom "ip_client" contenant la liste de tous les clients.

    De plus, je ne voie nulle part le "group by", pour faire la somme sur chaque client ?
    C'est quand même le point important pour faire une somme.

    Vous dites que votre résultat doit être celui d'un client.
    Je ne voie pas non plus la clause "where" sur ce client.

    D'autre part, le résultat de votre requête est soit la somme de la colonne "old_ttc" pour un client donné, soit "false". Que signifie ce "false" ?

    Si c'est une somme, le résultat doit être soit un nombre si les lignes existent, soit "NULL" dans le cas contraire.

    Voici un exemple reprenant ce qui a été dit dans ce sujet :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
        DEFAULT CHARACTER SET `latin1`
        DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `ip_client`
    --------------
     
    --------------
    CREATE TABLE `ip_client`
    ( `client_id`    integer unsigned not null primary key
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `ip_client` (`client_id`) values (10), (20), (30)
    --------------
     
    --------------
    select * from ip_client
    --------------
     
    +-----------+
    | client_id |
    +-----------+
    |        10 |
    |        20 |
    |        30 |
    +-----------+
    --------------
    DROP TABLE IF EXISTS `ip_client_olds`
    --------------
     
    --------------
    CREATE TABLE `ip_client_olds`
    ( `id`           integer unsigned not null AUTO_INCREMENT primary key,
      `client_id`    integer unsigned not null,
      `old_ttc`      decimal(15,2)        null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `ip_client_olds` (`client_id`,`old_ttc`) values
      (10, NULL), (20, 15.10), (10, 12.50), (20, 27.30)
    --------------
     
    --------------
    select * from ip_client_olds
    --------------
     
    +----+-----------+---------+
    | id | client_id | old_ttc |
    +----+-----------+---------+
    |  1 |        10 |    NULL |
    |  2 |        20 |   15.10 |
    |  3 |        10 |   12.50 |
    |  4 |        20 |   27.30 |
    +----+-----------+---------+
    --------------
    select    client_id,
              sum(old_ttc) as total
        from  ip_client_olds
    group by  client_id
    --------------
     
    +-----------+-------+
    | client_id | total |
    +-----------+-------+
    |        10 | 12.50 |
    |        20 | 42.40 |
    +-----------+-------+
    --------------
    select           t1.client_id,
                     sum(t2.old_ttc) as total
     
               from  ip_client      as t1
    left outer join  ip_client_olds as t2
                 on  t2.client_id = t1.client_id
     
           group by  t1.client_id
    --------------
     
    +-----------+-------+
    | client_id | total |
    +-----------+-------+
    |        10 | 12.50 |
    |        20 | 42.40 |
    |        30 |  NULL |
    +-----------+-------+
    --------------
    select           t1.client_id,
                     sum(coalesce(t2.old_ttc, 0)) as total
     
               from  ip_client      as t1
    left outer join  ip_client_olds as t2
                 on  t2.client_id = t1.client_id
     
           group by  t1.client_id
    --------------
     
    +-----------+-------+
    | client_id | total |
    +-----------+-------+
    |        10 | 12.50 |
    |        20 | 42.40 |
    |        30 |  0.00 |
    +-----------+-------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/03/2009, 00h10
  2. aide sur requête sql
    Par Vodkha dans le forum Langage SQL
    Réponses: 9
    Dernier message: 30/08/2005, 17h53
  3. [Requête SQL] Problème pour echantilloner
    Par jool dans le forum Langage SQL
    Réponses: 6
    Dernier message: 27/08/2005, 09h08
  4. Aide sur Requête SQL
    Par devdev dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/05/2005, 12h33
  5. [SQL]Somme pour chaque colonne de requete analyse
    Par Kekou03 dans le forum Access
    Réponses: 2
    Dernier message: 12/03/2005, 03h34

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