OVH Cloud OVH Cloud

Requete

4 réponses
Avatar
Renaud CLUIS
Bonjour,
Je n'arrive pas a faire une requete qui me sorte une balance client dont les
debits seraient entre 2 dates et les credits sans criteres de date.
Voici ma requete qui prend tout entre 2 dates mais je n'aimerai avoir que
les debits entre ces 2 dates et tous les credits!!:
Alter Procedure Pourbalancefinance

@dossie INT,@cptedeb INT,@cptefin INT,@datedeb smallDatetime,@datefin
smalldatetime

As

SELECT mouvement.cpte , mouvement.dossier, SUM(mouvement.debit) AS
SommeDedebit,

SUM(mouvement.credit) AS SommeDecredit, [Plan].designation

FROM dbo.mouvement INNER JOIN

dbo.[Plan] ON dbo.mouvement.dossier = dbo.[Plan].dossier AND
dbo.mouvement.cpte = dbo.[Plan].cpte

WHERE (dbo.mouvement.date >=@datedeb) AND (dbo.mouvement.date < @datefin)

GROUP BY dbo.mouvement.dossier, dbo.mouvement.cpte, dbo.[Plan].designation

HAVING (dbo.mouvement.cpte >=@cptedeb) AND (dbo.mouvement.cpte <=@cptefin)
AND (dbo.mouvement.dossier =@dossie)

Merci d'avance pour votre aide

Renaud

4 réponses

Avatar
Med Bouchenafa
L'idée serait de faire un UNION ALL avec les deux types de requetes.
Quelque chose qui ressemblerait à ceci

SELECT M.cpte ,
M.dossier,
SommeDebit = SUM(M.debit),
SommeCredit = 0,
P.designation
FROM dbo.mouvement M INNER JOIN dbo.[Plan] P ON M.dossier = P.dossier AND
M.cpte = P.cpte
WHERE M.date BETWEEN @datedeb AND @datefin
GROUP BY M.dossier, M.cpte, P.designation
HAVING M.cpte BETWEEN @cptedeb @cptefin AND M.dossier =@dossie

UNION ALL

SELECT M.cpte ,
M.dossier,
SommeDebit = 0,
SommeCredit = SUM(M.credit),
P.designation
FROM dbo.mouvement M INNER JOIN dbo.[Plan] P ON M.dossier = P.dossier AND
M.cpte = P.cpte
GROUP BY M.dossier, M.cpte, P.designation
HAVING M.cpte BETWEEN @cptedeb @cptefin AND M.dossier =@dossie

Tu peux utiliser une table temporaire pour stocker le résultat et renvoyer
un resultat formaté
L'idée est là. Il faut continuer à la creuser....

--
Bien cordialement
Med Bouchenafa


"Renaud CLUIS" a écrit dans le message de news:
%
Bonjour,
Je n'arrive pas a faire une requete qui me sorte une balance client dont
les
debits seraient entre 2 dates et les credits sans criteres de date.
Voici ma requete qui prend tout entre 2 dates mais je n'aimerai avoir que
les debits entre ces 2 dates et tous les credits!!:
Alter Procedure Pourbalancefinance

@dossie INT,@cptedeb INT,@cptefin INT,@datedeb smallDatetime,@datefin
smalldatetime

As

SELECT mouvement.cpte , mouvement.dossier, SUM(mouvement.debit) AS
SommeDedebit,

SUM(mouvement.credit) AS SommeDecredit, [Plan].designation

FROM dbo.mouvement INNER JOIN

dbo.[Plan] ON dbo.mouvement.dossier = dbo.[Plan].dossier AND
dbo.mouvement.cpte = dbo.[Plan].cpte

WHERE (dbo.mouvement.date >=@datedeb) AND (dbo.mouvement.date < @datefin)

GROUP BY dbo.mouvement.dossier, dbo.mouvement.cpte, dbo.[Plan].designation

HAVING (dbo.mouvement.cpte >=@cptedeb) AND (dbo.mouvement.cpte <=@cptefin)
AND (dbo.mouvement.dossier =@dossie)

Merci d'avance pour votre aide

Renaud




Avatar
TLE91
Bonjour,

Dans la suite de l'idée de Med (qui a été plus rapide pour répondre !!)
voici ma proposition (un peu compliqué mais j'espère que ça marche ...)
-----------------------------------------------------------------------------------------
Alter Procedure Pourbalancefinance

@dossie INT,@cptedeb INT,@cptefin INT,@datedeb smallDatetime,@datefin
smalldatetime

As

SELECT t.cpte , t.dossier, sum(t.debit) [SommeDedebit], sum(t.credit)
[SommeDecredit], [Plan].designation


FROM


(
SELECT mouvement.cpte [cpte] , mouvement.dossier [dossier], mouvement.debit
[debit], 0 [credit], [Plan].designation [designation]
FROM dbo.mouvement
INNER JOIN dbo.[Plan] ON dbo.mouvement.dossier = dbo.[Plan].dossier AND
dbo.mouvement.cpte = dbo.[Plan].cpte
WHERE (dbo.mouvement.date >=@datedeb) AND (dbo.mouvement.date < @datefin)
AND (dbo.mouvement.cpte >=@cptedeb) AND (dbo.mouvement.cpte <=@cptefin)
AND (dbo.mouvement.dossier =@dossie)
GROUP BY dbo.mouvement.dossier, dbo.mouvement.cpte, dbo.[Plan].designation

UNION


SELECT mouvement.cpte [cpte] , mouvement.dossier [dossier], 0 [debit],
mouvement.credit [credit], [Plan].designation [designation]
FROM dbo.mouvement
INNER JOIN dbo.[Plan] ON dbo.mouvement.dossier = dbo.[Plan].dossier AND
dbo.mouvement.cpte = dbo.[Plan].cpte
WHERE (dbo.mouvement.date >=@datedeb) AND (dbo.mouvement.date < @datefin)
AND (dbo.mouvement.dossier =@dossie)
GROUP BY dbo.mouvement.dossier, dbo.mouvement.cpte, dbo.[Plan].designation) t
GROUP BY t.cpte, t.dossier, dbo.[Plan].designatio
-----------------------------------------------------------------------------------------

Cordialement.


"Renaud CLUIS" a écrit :

Bonjour,
Je n'arrive pas a faire une requete qui me sorte une balance client dont les
debits seraient entre 2 dates et les credits sans criteres de date.
Voici ma requete qui prend tout entre 2 dates mais je n'aimerai avoir que
les debits entre ces 2 dates et tous les credits!!:
Alter Procedure Pourbalancefinance

@dossie INT,@cptedeb INT,@cptefin INT,@datedeb smallDatetime,@datefin
smalldatetime

As

SELECT mouvement.cpte , mouvement.dossier, SUM(mouvement.debit) AS
SommeDedebit,

SUM(mouvement.credit) AS SommeDecredit, [Plan].designation

FROM dbo.mouvement INNER JOIN

dbo.[Plan] ON dbo.mouvement.dossier = dbo.[Plan].dossier AND
dbo.mouvement.cpte = dbo.[Plan].cpte

WHERE (dbo.mouvement.date >=@datedeb) AND (dbo.mouvement.date < @datefin)

GROUP BY dbo.mouvement.dossier, dbo.mouvement.cpte, dbo.[Plan].designation

HAVING (dbo.mouvement.cpte >=@cptedeb) AND (dbo.mouvement.cpte <=@cptefin)
AND (dbo.mouvement.dossier =@dossie)

Merci d'avance pour votre aide

Renaud





Avatar
Fred BROUARD
Bonjour

NOTES :
1) ta clause HAVING ne sert à rien parce qu'elle ne contient aucune fonction
d'agrégation,
2) lesparenthèses ne sont d'aucune utilité dans les prédicats
3) utilise des surnom pour tes tables cela rend plus lisible

teste cette solution :

SELECT COALESCE(MD.cpte, MC.cpte),
COALESCE(MD.dossier, MC.dossier)
SUM(MD.debit) AS SommeDedebit,
SUM(MC.credit) AS SommeDecredit,
P.designation

FROM dbo.[Plan] P
INNER JOIN dbo.mouvement MD
ON P.dossier = MD.dossier
AND P.cpte = MD.cpte
INNER JOIN dbo.mouvement MC
ON P.dossier = MC.dossier
AND P.cpte = MC.cpte

WHERE MD.date >=@datedeb
AND MD.date < @datefin
AND MD.cpte >=@cptedeb
AND MD.cpte <=@cptefin
AND MD.dossier =@dossie
AND MC.date >=@datedeb
AND MC.date < @datefin
AND MC.cpte >=@cptedeb
AND MC.cpte <=@cptefin
AND MC.dossier =@dossie

GROUP BY MC.dossier,
MC.cpte,
MD.dossier,
MD.cpte,
P.designation

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste 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 *************************

Renaud CLUIS a écrit:
Bonjour,
Je n'arrive pas a faire une requete qui me sorte une balance client dont les
debits seraient entre 2 dates et les credits sans criteres de date.
Voici ma requete qui prend tout entre 2 dates mais je n'aimerai avoir que
les debits entre ces 2 dates et tous les credits!!:
Alter Procedure Pourbalancefinance

@dossie INT,@cptedeb INT,@cptefin INT,@datedeb smallDatetime,@datefin
smalldatetime

As

SELECT mouvement.cpte , mouvement.dossier, SUM(mouvement.debit) AS
SommeDedebit,

SUM(mouvement.credit) AS SommeDecredit, [Plan].designation

FROM dbo.mouvement INNER JOIN

dbo.[Plan] ON dbo.mouvement.dossier = dbo.[Plan].dossier AND
dbo.mouvement.cpte = dbo.[Plan].cpte

WHERE (dbo.mouvement.date >=@datedeb) AND (dbo.mouvement.date < @datefin)

GROUP BY dbo.mouvement.dossier, dbo.mouvement.cpte, dbo.[Plan].designation

HAVING (dbo.mouvement.cpte >=@cptedeb) AND (dbo.mouvement.cpte <=@cptefin)
AND (dbo.mouvement.dossier =@dossie)

Merci d'avance pour votre aide

Renaud




Avatar
Renaud CLUIS
Merci encore de votre réponse qui me convient parfaitement et qui marche
avec 1 ou 2 amenagements.
Cordialement.

Renaud CLUIS

"TLE91" a écrit dans le message de
news:
Bonjour,

Dans la suite de l'idée de Med (qui a été plus rapide pour répondre !!)
voici ma proposition (un peu compliqué mais j'espère que ça marche ...) :
--------------------------------------------------------------------------


---------------
Alter Procedure Pourbalancefinance

@dossie INT,@cptedeb INT,@cptefin INT,@datedeb smallDatetime,@datefin
smalldatetime

As

SELECT t.cpte , t.dossier, sum(t.debit) [SommeDedebit], sum(t.credit)
[SommeDecredit], [Plan].designation


FROM


(
SELECT mouvement.cpte [cpte] , mouvement.dossier [dossier],


mouvement.debit
[debit], 0 [credit], [Plan].designation [designation]
FROM dbo.mouvement
INNER JOIN dbo.[Plan] ON dbo.mouvement.dossier = dbo.[Plan].dossier AND
dbo.mouvement.cpte = dbo.[Plan].cpte
WHERE (dbo.mouvement.date >=@datedeb) AND (dbo.mouvement.date < @datefin)
AND (dbo.mouvement.cpte >=@cptedeb) AND (dbo.mouvement.cpte <=@cptefin)
AND (dbo.mouvement.dossier =@dossie)
GROUP BY dbo.mouvement.dossier, dbo.mouvement.cpte, dbo.[Plan].designation

UNION


SELECT mouvement.cpte [cpte] , mouvement.dossier [dossier], 0 [debit],
mouvement.credit [credit], [Plan].designation [designation]
FROM dbo.mouvement
INNER JOIN dbo.[Plan] ON dbo.mouvement.dossier = dbo.[Plan].dossier AND
dbo.mouvement.cpte = dbo.[Plan].cpte
WHERE (dbo.mouvement.date >=@datedeb) AND (dbo.mouvement.date < @datefin)
AND (dbo.mouvement.dossier =@dossie)
GROUP BY dbo.mouvement.dossier, dbo.mouvement.cpte,


dbo.[Plan].designation) t
GROUP BY t.cpte, t.dossier, dbo.[Plan].designation
--------------------------------------------------------------------------


---------------

Cordialement.


"Renaud CLUIS" a écrit :

> Bonjour,
> Je n'arrive pas a faire une requete qui me sorte une balance client dont


les
> debits seraient entre 2 dates et les credits sans criteres de date.
> Voici ma requete qui prend tout entre 2 dates mais je n'aimerai avoir


que
> les debits entre ces 2 dates et tous les credits!!:
> Alter Procedure Pourbalancefinance
>
> @dossie INT,@cptedeb INT,@cptefin INT,@datedeb smallDatetime,@datefin
> smalldatetime
>
> As
>
> SELECT mouvement.cpte , mouvement.dossier, SUM(mouvement.debit) AS
> SommeDedebit,
>
> SUM(mouvement.credit) AS SommeDecredit, [Plan].designation
>
> FROM dbo.mouvement INNER JOIN
>
> dbo.[Plan] ON dbo.mouvement.dossier = dbo.[Plan].dossier AND
> dbo.mouvement.cpte = dbo.[Plan].cpte
>
> WHERE (dbo.mouvement.date >=@datedeb) AND (dbo.mouvement.date <


@datefin)
>
> GROUP BY dbo.mouvement.dossier, dbo.mouvement.cpte,


dbo.[Plan].designation
>
> HAVING (dbo.mouvement.cpte >=@cptedeb) AND (dbo.mouvement.cpte


<=@cptefin)
> AND (dbo.mouvement.dossier =@dossie)
>
> Merci d'avance pour votre aide
>
> Renaud
>
>
>