Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/08/2011, 15h56   #1
Membre habitué
 
Inscription : mai 2008
Messages : 285
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : mai 2008
Messages : 285
Points : 111
Points : 111
Par défaut Soustraire une requête B.

Bonjour à tous,

Je cherche a créer une requête spéciale
J'ai cette requête:
ReqA:
Code :
1
2
3
4
SELECT c.date, SUM(c.quantites) AS nombre, SUM(c.debit) AS vente 
FROM consommations c 
WHERE (c.date BETWEEN '"+date_debut+"' AND '"+date_fin+"') 
GROUP BY "+mode_date+""
Mais j'aimerais Soustraire a nombre et vente la somme de cette requête:
ReqB:
Code :
1
2
3
4
SELECT c.date, SUM(c.quantites) AS nombre, SUM(c.debit) AS vente 
FROM consommations c 
WHERE (c.date BETWEEN '"+date_debut+"' AND '"+date_fin+"')  AND `invitation`=1 
GROUP BY "+mode_date+""
Pour que ça donne en gros ReqA-ReqB
Est ce possible?
Obtenir un truc dans ce genre:
ReqA-ReqB:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT c.date, 
(SUM(c.quantites)-
(SELECT SUM(c.quantites) AS nombre 
FROM consommations c 
WHERE (c.date BETWEEN '"+date_debut+"' AND '"+date_fin+"')  AND `invitation`=1 
GROUP BY "+mode_date+") ) AS nombre, 
(SUM(c.debit)-
(SELECT SUM(c.debit) AS vente 
FROM consommations c 
WHERE (c.date BETWEEN '"+date_debut+"' AND '"+date_fin+"')  AND `invitation`=1 
GROUP BY "+mode_date+") ) AS vente 
FROM consommations c 
WHERE (c.date BETWEEN '"+date_debut+"' AND '"+date_fin+"') 
GROUP BY "+mode_date+""
Le problème c'est que ça ne fonctionne pas.
Citation:
#1241 - Operand should contain 1 column(s)
EDIT > je viens de trouvé j'ai corrigé, j'avais pas précisé la colonne concernée
Le problème est que le résultat est flottant 326.400000870228
Le champ de debit est en FLOAT
Comment y remédier pour que ça affiche 326.4

Merci
peofofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 16h15   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
Bonjour,

Peut-être en faisant comme ça :
Code :
1
2
3
4
5
6
SELECT c.date
, SUM(CASE WHEN invitation = 1 THEN c.quantites ELSE 0 END) AS nombre
, SUM(CASE WHEN invitation = 1 THEN c.debit ELSE 0 END) AS vente 
FROM consommations c 
WHERE (c.date BETWEEN '"+date_debut+"' AND '"+date_fin+"')  AND `invitation`=1 
GROUP BY c.date
Dans le GROUP BY, pas besoin de mettre une variable... c.date suffit.
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 16h34   #3
Membre habitué
 
Inscription : mai 2008
Messages : 285
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : mai 2008
Messages : 285
Points : 111
Points : 111
Merci ced, mais ce n'est pas vraiment ce que je cherchais.

Ta requête ne me soustrait pas la requête B.
Mais elle me parait plus joli, peut-on la modifier? pour soustraire les 2 champs?

Pour le type que je cherchais, j'ai remplacé par DECIMAL(5,2).
Le problème est que je n'ai pas fait d'essai, j'ai remplacé directement par DECIMAL(0,0), du coups tous les résultats sont faux, il va falloir que je récupère un backup qui traine.

Mais si on peut améliorer ta requête je suis preneur!
peofofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 16h40   #4
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
Pffff... dur, dur, cet après-midi...
J'ai inversé le résultat des CASE et du coup, ça correspond pile à ta deuxième requête et pas à la soustraction.
Essaie plutôt comme ça :
Code :
1
2
3
4
5
6
SELECT c.date
, SUM(CASE WHEN invitation = 1 THEN 0 ELSE c.quantites END) AS nombre
, SUM(CASE WHEN invitation = 1 THEN 0 ELSE c.debit END) AS vente 
FROM consommations c 
WHERE (c.date BETWEEN '"+date_debut+"' AND '"+date_fin+"')  AND `invitation`=1 
GROUP BY c.date
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 20h55   #5
Membre habitué
 
Inscription : mai 2008
Messages : 285
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : mai 2008
Messages : 285
Points : 111
Points : 111
Merci ced,

Mais, je suis désolé, je ne vois pas de soustraction!

EDIT> J'ai un problème sur la requête lorsque j'ai plusieurs lignes:
J'ai donc aliaser mes colonnes.
Voici la requête:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT c.date, 
(SUM(c.quantites)-
(SELECT SUM(c1.quantites)
FROM consommations c1 
WHERE (c1.date BETWEEN '2010-02-19 18:24:30' AND '2011-08-19 18:24:30')  AND `invitation`=1 
GROUP BY YEAR(c.date), MONTH(c.date)) ) AS nombre, 
(SUM(c.debit)-
(SELECT SUM(c2.debit)
FROM consommations c2 
WHERE (c2.date BETWEEN '2010-02-19 18:24:30' AND '2011-08-19 18:24:30')  AND `invitation`=1 
GROUP BY YEAR(c.date), MONTH(c.date)) ) AS vente 
FROM consommations c 
WHERE (c.date BETWEEN '2010-02-19 18:24:30' AND '2011-08-19 18:24:30') 
GROUP BY YEAR(c.date), MONTH(c.date)
Le problème est que je n'ai pas les bonnes valeurs qui apparaissent.

Pour obtenir il faut que je change
Code :
GROUP BY YEAR(c.date), MONTH(c.date)
en:
Code :
GROUP BY YEAR(c1.date), MONTH(c1.date)
et
Code :
GROUP BY YEAR(c2.date), MONTH(c2.date)
Mais si je fais cette manip il me renvoit:
#1242 - Subquery returns more than 1 row

Si je met:
Code :
GROUP BY (YEAR(c2.date), MONTH(c2.date))
J'ai l'erreur:
#1241 - Operand should contain 1 column(s)

Je vois pas comment corriger!

Comment faire?
Merci
peofofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2011, 11h05   #6
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Citation:
Mais, je suis désolé, je ne vois pas de soustraction
Pas besoin de soustraction, la requête somme 0 si invitation = 1, par contre il ne faut pas filtrer sur invitation = 1
Code :
1
2
3
4
5
6
SELECT c.date
       , SUM(CASE WHEN c.invitation = 1 THEN 0 ELSE c.quantites END) AS nombre
       , SUM(CASE WHEN c.invitation = 1 THEN 0 ELSE c.debit END) AS vente 
  FROM consommations c 
 WHERE c.date BETWEEN '"+date_debut+"' AND '"+date_fin+"'
 GROUP BY YEAR(c.date), MONTH(c.date)
Citation:
#1242 - Subquery returns more than 1 row
Avec GROUP BY tu as plusieurs lignes dans les sous-requêtes, il faut en fait corréler les sous-requêtes à la requête prinicipale
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT c.date, 
       (SUM(c.quantites)- (SELECT SUM(c1.quantites)
                             FROM consommations c1 
                            WHERE c1.invitation = 1 
                              AND YEAR(c1.date) = YEAR(c.date) 
							  AND MONTH(c1.date) = MONTH(c.date)) 
        ) AS nombre, 
       (SUM(c.debit)- (SELECT SUM(c2.debit)
                         FROM consommations c2 
                        WHERE c2.invitation = 1 
		                  AND YEAR(c2.date) = YEAR(c.date) 
						  AND MONTH(c2.date) = MONTH(c.date)) 
        ) AS vente 
  FROM consommations c 
 WHERE c.date BETWEEN '2010-02-19 18:24:30' AND '2011-08-19 18:24:30'
 GROUP BY YEAR(c.date), MONTH(c.date)
Si les 2 requêtes renvoient bien le même résultat, préfère celle de ced, sinon fournis peut être un petit jeu de test.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2011, 12h26   #7
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
Concernant ma requête, il y a peut-être un CAST implicite de MySQL en INTEGER, à cause de la valeur 0 que j'ai mise. Du coup, le résultat est calculé sous forme d'entier, ce qui peut poser problème.
Il faudrait convertir ce 0 en FLOAT, dans un premier temps, en faisant juste ça :
Code :
1
2
3
4
5
6
SELECT c.date
, SUM(CASE WHEN invitation = 1 THEN CAST(0 AS FLOAT) ELSE c.quantites END) AS nombre
, SUM(CASE WHEN invitation = 1 THEN CAST(0 AS FLOAT) ELSE c.debit END) AS vente 
FROM consommations c 
WHERE (c.date BETWEEN '"+date_debut+"' AND '"+date_fin+"')
GROUP BY c.date
Au passage, comme l'a si justement signalé skuatamad, j'ai corrigé un autre bug dans ma requête : j'avais laissé AND invitation = 1 dans la clause WHERE, alors qu'il faut bien sûr l'enlever, vu que la condition passe dans les CASE... Erreur de copier/coller...
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2011, 13h41   #8
Membre habitué
 
Inscription : mai 2008
Messages : 285
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : mai 2008
Messages : 285
Points : 111
Points : 111
Merci pour vos réponses

C'est exactement ce que je cherchais.
Cette requête fonctionne à merveille :
Code :
1
2
3
4
5
6
SELECT c.date
       , SUM(CASE WHEN c.invitation = 1 THEN 0 ELSE c.quantites END) AS nombre
       , SUM(CASE WHEN c.invitation = 1 THEN 0 ELSE c.debit END) AS vente 
  FROM consommations c 
 WHERE c.date BETWEEN '"+date_debut+"' AND '"+date_fin+"'
 GROUP BY YEAR(c.date), MONTH(c.date)

Merci à tous les 2
peofofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h58.


 
 
 
 
Partenaires

Hébergement Web