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 :

Soustraction dans un select


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 231
    Points : 82
    Points
    82
    Par défaut Soustraction dans un select
    Bonjour,

    Je dispose de deux tables ayant cette structure

    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
    CREATE TABLE IF NOT EXISTS `sinvoiced` (
      `num` varchar(15) NOT NULL,
      `itmref` varchar(20) NOT NULL,
      `netpri` decimal(13,2) NOT NULL,
      `qty` decimal(13,2) NOT NULL,
      `tsicod` varchar(3) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='';
     
     
    ALTER TABLE `sinvoiced`
     ADD KEY `num` (`num`), ADD KEY `tsicod` (`tsicod`);
     
    CREATE TABLE IF NOT EXISTS `sinvoicev` (
      `num` varchar(15) NOT NULL,
      `bpcinv` varchar(15) NOT NULL,
      `bpaadd` varchar(3) NOT NULL,
      `invtyp` enum('1','2') NOT NULL,
      `invdat` date NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='';
     
    ALTER TABLE `sinvoicev`
     ADD PRIMARY KEY (`num`), ADD KEY `bpcinv` (`bpcinv`,`bpaadd`,`invtyp`);
    Ces tables correspondent à la liste des factures et avoir, sinvoicev pour les entêtes et sinvoiced pour le détail des factures et avoirs. Pour différencier une facture d'un avoir c'est le champ sinvoicev.invtyp (1 pour une facture et 2 pour un avoir).

    Sur ces tables je dois effectuer une requête pour faire une somme des factures ou avoirs et parfois je dois sortir une somme en ayant soustrait les avoirs.

    Pour le moment en php j'ai ce code
    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
      /* ---
      bpcord : code client
      bpaadd : code adresse de livraison
      annee : annee de recherche
      mois : mois de recherche, peut être vide pour faire une recherche sur l'année entière
      tsicod : famille article recherché
      type : 1 pour facture, 2 pour avoir
      ---- */
      public function getStatsMois($bpcord, $bpaadd, $annee, $mois, $tsicod, $type) {
        $query  = "SELECT MONTH(sinvoicev.invdat) as mois, SUM(sinvoiced.netpri*sinvoiced.qty) AS netpri";
        $query .= " FROM sinvoicev";
        $query .= " INNER JOIN sinvoiced ON sinvoicev.num = sinvoiced.num";
        $query .= " WHERE";
        $query .= "  sinvoicev.invtyp = '".$type."' AND";
        $query .= "  sinvoicev.bpcinv = '".$bpcord."' AND";
        $query .= "  sinvoicev.bpaadd = '".$bpaadd."' AND";
        $query .= "  YEAR(sinvoicev.invdat) = '".$annee."'";
        if(!empty($tsicod)) {
          $query .= " AND sinvoiced.tsicod = '".$tsicod."'";
        }
        if(empty($mois)) {
          $query .= " AND MONTH(sinvoicev.invdat) BETWEEN '01' AND '12'";
          $query .= " GROUP BY MONTH(sinvoicev.invdat)";
        } else {
          $query .= " AND MONTH(sinvoicev.invdat) = '".$mois."'";
        }
     
        $result = $this->database->query($query)->fetchAll(PDO::FETCH_ASSOC);
        if(empty($result[0]['mois'])) {
          $stat[0]['mois'] = $mois;
          $stat[0]['netpri'] = 0;
        } else {
          $stat = $result;
        }
     
        return $stat;
      }
    afin d'optimiser tout ça je voudrais pouvoir soustraire directement les avoirs lors de la requête et non le faire faire à php. Est-ce possible ?

    Merci d'avance.

  2. #2
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Sans garantie mais l'idée y est.

    Code php : 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
     
    <?php
      /* ---
      bpcord : code client
      bpaadd : code adresse de livraison
      annee : annee de recherche
      mois : mois de recherche, peut être vide pour faire une recherche sur l'année entière
      tsicod : famille article recherché
      type : 1 pour facture, 2 pour avoir
      ---- */
      public function getStatsMois($bpcord, $bpaadd, $annee, $mois, $tsicod, $type) {
        $query  = "SELECT MONTH(sinvoicev.invdat) as mois, SUM(sinvoiced.netpri*sinvoiced.qty * (case when sinvoicev.invtyp = 1 then 1 else -1 end)) AS netpri";
        $query .= " FROM sinvoicev";
        $query .= " INNER JOIN sinvoiced ON sinvoicev.num = sinvoiced.num";
        $query .= " WHERE";
      //  $query .= "  sinvoicev.invtyp = '".$type."' AND";
        $query .= "  sinvoicev.bpcinv = '".$bpcord."' AND";
        $query .= "  sinvoicev.bpaadd = '".$bpaadd."' AND";
        $query .= "  YEAR(sinvoicev.invdat) = '".$annee."'";
        if(!empty($tsicod)) {
          $query .= " AND sinvoiced.tsicod = '".$tsicod."'";
        }
        if(empty($mois)) {
          $query .= " AND MONTH(sinvoicev.invdat) BETWEEN '01' AND '12'";
          $query .= " GROUP BY MONTH(sinvoicev.invdat)";
        } else {
          $query .= " AND MONTH(sinvoicev.invdat) = '".$mois."'";
        }
     
        $result = $this->database->query($query)->fetchAll(PDO::FETCH_ASSOC);
        if(empty($result[0]['mois'])) {
          $stat[0]['mois'] = $mois;
          $stat[0]['netpri'] = 0;
        } else {
          $stat = $result;
        }
     
        return $stat;
      }
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  3. #3
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 231
    Points : 82
    Points
    82
    Par défaut
    Nikel ça marche.

    Je vais pouvoir enlever pas mal de code php ta requête.

    Merci

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

Discussions similaires

  1. [debutant]soustraction datetime & test de nullité dans un select.
    Par KilKennY dans le forum Développement
    Réponses: 3
    Dernier message: 09/04/2009, 17h11
  2. [interbase][SQL] concatener 2 champs dans le select
    Par Harry dans le forum Bases de données
    Réponses: 10
    Dernier message: 09/03/2006, 06h45
  3. Joindre une valeur arbitraire dans un SELECT
    Par Tuxxy dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/01/2004, 17h04
  4. Réponses: 3
    Dernier message: 23/09/2003, 09h12
  5. [Sybase] Select dans une select loop en C
    Par Claudio dans le forum Sybase
    Réponses: 2
    Dernier message: 29/04/2003, 18h06

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