Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Calculs dans une requête

7 réponses
Avatar
Eric
Bonjour,

Sur une base SQL Server, j'ai une table ECRITURES, contenant des
écritures comptables, possédant 3 colonnes : CLIENT, MONTANT et SENS (à
0 pour débit et 1 pour crédit).

Actuellement, pour calculer le solde des CLIENT, je fais :
SELECT SUM(MONTANT) AS Total FROM ECRITURES WHERE SENS=0 GROUP BY CLIENT
pour le total des débits, et
SELECT SUM(MONTANT) AS Total FROM ECRITURES WHERE SENS=1 GROUP BY CLIENT
pour le total des crédits. Je dois ensuite calculer la différence pour
chacun des CLIENT afin d'obtenir le solde.

N'y aurait-il pas un moyen pour regrouper ces 2 requêtes en une seule
qui ferait le calcul du solde directement ?

--
Cordialement

7 réponses

Avatar
Fred BROUARD - SQLpro
SELECT SUM(CASE
WHEN SENS=0
THEN MONTANT * -1
WHEN SENS=1
THEN MONTANT
END) AS Solde
FROM ECRITURES
GROUP BY CLIENT

A +


--
Frédéric BROUARD, MVP MS SQL Server. Expert Langage SQL / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************


Eric a écrit:
Bonjour,

Sur une base SQL Server, j'ai une table ECRITURES, contenant des
écritures comptables, possédant 3 colonnes : CLIENT, MONTANT et SENS (à
0 pour débit et 1 pour crédit).

Actuellement, pour calculer le solde des CLIENT, je fais :
SELECT SUM(MONTANT) AS Total FROM ECRITURES WHERE SENS=0 GROUP BY CLIENT
pour le total des débits, et
SELECT SUM(MONTANT) AS Total FROM ECRITURES WHERE SENS=1 GROUP BY CLIENT
pour le total des crédits. Je dois ensuite calculer la différence pour
chacun des CLIENT afin d'obtenir le solde.

N'y aurait-il pas un moyen pour regrouper ces 2 requêtes en une seule
qui ferait le calcul du solde directement ?

Avatar
Eric
Le 3 juin 2004 à 00:05, Fred BROUARD - SQLpro nous disait :

SELECT SUM(CASE
WHEN SENS=0
THEN MONTANT * -1
WHEN SENS=1
THEN MONTANT
END) AS Solde
FROM ECRITURES
GROUP BY CLIENT



Merci pour votre aide, c'est exactement ce qu'il me fallait.
Et bravo pour votre site.

--
Cordialement
Avatar
Yanos El Guerilleros
Salut,

Question idiote : Pourquoi " MONTANT * -1 "

Est-ce que " - MONTANT " ne serait pas mieux ?

En tout cas plus rapide (selon ma logique de programmeur :)

A++

Yanos

SELECT SUM(CASE
WHEN SENS=0
THEN MONTANT * -1
WHEN SENS=1
THEN MONTANT
END) AS Solde
FROM ECRITURES
GROUP BY CLIENT
Avatar
Antoine Dinimant
Yanos El Guerilleros a écrit:
Salut,

Question idiote : Pourquoi " MONTANT * -1 "

Est-ce que " - MONTANT " ne serait pas mieux ?

En tout cas plus rapide (selon ma logique de programmeur :)

A++




si on part là-dedans, je dirais
SELECT SUM(MONTANT * (SENS - .5)) * 2

qui n'est pas forcément top lisible mais évite le CASE WHEN
Avatar
Eric
Le 3 juin 2004 à 20:55, Antoine Dinimant nous disait :

si on part là-dedans, je dirais
SELECT SUM(MONTANT * (SENS - .5)) * 2

qui n'est pas forcément top lisible mais évite le CASE WHEN



Et qui marche très bien aussi. Merci à tous.

--
Cordialement
Avatar
Fred BROUARD - SQLpro
Beaucoup moins rapide en execution !.

Multiplier par -1 fait un simple chagement d'un seul bit
Multiplier par un flottant nécessite de nombreux cycle machine...

A +

Antoine Dinimant a écrit:
Yanos El Guerilleros a écrit:

Salut,

Question idiote : Pourquoi " MONTANT * -1 "

Est-ce que " - MONTANT " ne serait pas mieux ?

En tout cas plus rapide (selon ma logique de programmeur :)

A++




si on part là-dedans, je dirais
SELECT SUM(MONTANT * (SENS - .5)) * 2

qui n'est pas forcément top lisible mais évite le CASE WHEN




--
Frédéric BROUARD, MVP MS SQL Server. Expert Langage SQL / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Avatar
Antoine Dinimant
Fred BROUARD - SQLpro a écrit:
Beaucoup moins rapide en execution !.

Multiplier par -1 fait un simple chagement d'un seul bit
Multiplier par un flottant nécessite de nombreux cycle machine...



je m'en souviendrai ! merci !