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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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 ?
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 ?
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 ?
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
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.
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
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 *************************
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 *************************
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 *************************
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 !
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...