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 :

Soustraire les résultats de 2 sous-requêtes [MySQL-8.0]


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    data analyst
    Inscrit en
    Juillet 2021
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : data analyst

    Informations forums :
    Inscription : Juillet 2021
    Messages : 26
    Points : 18
    Points
    18
    Par défaut Soustraire les résultats de 2 sous-requêtes
    Bonjour !

    Nom : substr.jpg
Affichages : 86
Taille : 37,4 Ko

    J'ai essayé de placer un '-' à différents endroits avec différents rajout de parenthèseS , je n'arrive pas à obtenir une 3eme colonne "trimestre_2 - trimestre_1"

    J'ai par exemple essayé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT 
    (SELECT count(transaction.id) FROM transaction  WHERE date_mutation > '2020-03-31') AS trimestre_2,
    (SELECT count(transaction.id) FROM transaction  WHERE date_mutation < '2020-04-01' ) AS trimestre_1,
    trimestre_2 - trimestre_1 AS difference;

    ----------------------------------------------> SYNTAX ERROR

    De l'aide serait grandement apprécié !

  2. #2
    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 381
    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 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut

    Voici un exemple :
    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
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `id`    integer unsigned NOT NULL AUTO_INCREMENT primary key,
      `date`  date             NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`date`) values
    ('2021-03-15'),('2021-05-01'),('2021-02-24'),('2021-06-18'),('2020-05-24'),('2021-02-17'),('2021-04-07'),('2021-01-05')
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+------------+
    | id | date       |
    +----+------------+
    |  1 | 2021-03-15 |
    |  2 | 2021-05-01 |
    |  3 | 2021-02-24 |
    |  4 | 2021-06-18 |
    |  5 | 2020-05-24 |
    |  6 | 2021-02-17 |
    |  7 | 2021-04-07 |
    |  8 | 2021-01-05 |
    +----+------------+
    --------------
    select sum(trim1) as trim1,
           sum(trim2) as trim2,
     
           sum(trim2) - sum(trim1) as diff
     
      from (   select case when quarter(`date`) = 2 then 1 else 0 end as trim2,
                      case when quarter(`date`) = 1 then 1 else 0 end as trim1
     
                 from `test`
                where date between '2021-01-01' and '2021-12-31'
           ) as x
    --------------
     
    +-------+-------+------+
    | trim1 | trim2 | diff |
    +-------+-------+------+
    |     4 |     3 |   -1 |
    +-------+-------+------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Membre à l'essai
    Homme Profil pro
    data analyst
    Inscrit en
    Juillet 2021
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : data analyst

    Informations forums :
    Inscription : Juillet 2021
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Salut

    Voici un exemple :
    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
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `id`    integer unsigned NOT NULL AUTO_INCREMENT primary key,
      `date`  date             NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`date`) values
    ('2021-03-15'),('2021-05-01'),('2021-02-24'),('2021-06-18'),('2020-05-24'),('2021-02-17'),('2021-04-07'),('2021-01-05')
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+------------+
    | id | date       |
    +----+------------+
    |  1 | 2021-03-15 |
    |  2 | 2021-05-01 |
    |  3 | 2021-02-24 |
    |  4 | 2021-06-18 |
    |  5 | 2020-05-24 |
    |  6 | 2021-02-17 |
    |  7 | 2021-04-07 |
    |  8 | 2021-01-05 |
    +----+------------+
    --------------
    select sum(trim1) as trim1,
           sum(trim2) as trim2,
     
           sum(trim2) - sum(trim1) as diff
     
      from (   select case when quarter(`date`) = 2 then 1 else 0 end as trim2,
                      case when quarter(`date`) = 1 then 1 else 0 end as trim1
     
                 from `test`
                where date between '2021-01-01' and '2021-12-31'
           ) as x
    --------------
     
    +-------+-------+------+
    | trim1 | trim2 | diff |
    +-------+-------+------+
    |     4 |     3 |   -1 |
    +-------+-------+------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    @+
    Je ne comprend pas l’effort donné de reproduire tout ça alors qu'il suffit de reprendre ma requête avec la bonne syntaxe
    (time saving for both of us)

    Je suis toujours au même point car je ne connais ni case, ni quarter, ni else/then

    C'est quoi le problème avec mon exemple ? je demandais simplement pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     trimestre_2 - trimestre_1 AS difference;
    ne marche pas...

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Citation Envoyé par moonlight09 Voir le message
    je demandais simplement pourquoi trimestre_2 - trimestre_1 AS difference; ne marche pas...
    Parce que les expressions calculées dans la clause SELECT ne sont pas connues à l'intérieur de celle-ci (pour MySQL ; d'autres SGBD savent le faire).
    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.

  5. #5
    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 381
    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 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut à tous.

    Citation Envoyé par moonlight09
    Je ne comprends pas l’effort donné de reproduire tout ça alors qu'il suffit de reprendre ma requête avec la bonne syntaxe.
    Votre requête en l'état ne peut pas fonctionner puisque la syntaxe ne vous permet pas d'obtenir la différence entre deux calculs.

    Citation Envoyé par moonlight09
    Je suis toujours au même point car je ne connais ni case, ni quarter, ni else/then
    La fonction "quarter()" vous donne le numéro du trimestre 1, 2, 3 ou 4.
    --> https://dev.mysql.com/doc/refman/8.0...nction_quarter

    Le "case ... when ... then ...else ... end" permet de gérer une condition dans une requête.
    --> https://dev.mysql.com/doc/refman/8.0/en/case.html

    Si vous ne connaissez pas, et bien il faut apprendre.

    Citation Envoyé par moonlight09
    C'est quoi le problème avec mon exemple ?
    Vous avez la réponse de la part de Al1_24.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

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

Discussions similaires

  1. [2008] Soustraire les résultats de deux requêtes
    Par demerius dans le forum Développement
    Réponses: 2
    Dernier message: 04/11/2014, 16h11
  2. requête basé sur les résultats des deux sous requete
    Par karwafmhz dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/06/2011, 23h19
  3. Utiliser les résultats d'une sous-requête
    Par BBric dans le forum Requêtes
    Réponses: 6
    Dernier message: 22/04/2011, 01h19
  4. Afficher les résultats nuls d'une requête somme
    Par vorjan dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 08/08/2008, 01h54
  5. Sélection de tous les champs d'une sous-Requête que je redéfini
    Par electrosat03 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 28/06/2007, 16h43

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