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

Ecriture d'une requête

3 réponses
Avatar
jack
Bonjour,
J'essaie d'écrire une requête sans passer par des curseurs mais je ne sais
pas si je peux obtenir le résultat que je souhaite.
J'ai 3 tables CLIENTS, FACTURE,LIGNE_FACTURE

Je fais un

select r.cliID, r.client, sum(r.ht) as ht from
(
SELECT
fl.FLIG_ID as ligneFactID
,fl.FACT_ID as factID
,fl.FLIG_TOTALHT as ht
,c.CLIE_ID as cliID
,c.CLIE_NOM as client

from facture_ligne fl
inner join facture f on f.FACT_ID=fl.FACT_ID
inner join client c on c.CLIE_ID=f.CLIE_ID

where fl... (là les critères varient)
) r

group by r.CLIID,r.client

Ce que j'aimerais obtenir c'est une colonne supplémentaire dans le résultat
final avec, par client, les id des lignes de factures (concaténés)
retournées par la requete

Quelque chose du genre

select r.cliID, r.client, sum(r.ht) as ht, idLignes =(1,23,45,567,...) from
...
CE qui donnerait comme résultat

cliID client ht IDLignes
1 Durand 1000 1,23,45
2 Dupond 245 2,67,98
3 Dupuis 500 3, 27, 123

etc, etc,

Est-ce possible directement par une requête ?

Merci

3 réponses

Avatar
Med Bouchenafa
Voici un code que j'ai pondu sur la base Northwind
(J'ai cependant ajouté une table OrderDetails ayant la meme structure que
[Order Details] mais avec OrderDetailsID comme IDENTITY)

Toute l'astuce est dans la creation d'une fonction qui te retourne la liste
des lignes de factures pour une facture donnée
CREATE FUNCTION dbo.get_FactureDetails (@FactureID AS int)
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE @strQuery AS VARCHAR(1000)
SET @strQuery = ''

SELECT @strQuery = @strQuery + CAST(OrderDetailsID AS varchar(8)) + ','
FROM dbo.OrderDetails
WHERE OrderID = @FactureID

RETURN @strQuery
END
GO


SELECT Client = C.ContactName,
Total = SUM( UnitPrice * Quantity),
"Nbre de lignes" = COUNT( D.ProductID),
List = dbo.get_FactureDetails(O.OrderID)
FROM dbo.Customers C INNER JOIN dbo.Orders O ON C.CustomerID = O.CustomerID
INNER JOIN dbo.[Order Details] D ON
O.OrderID = D.OrderID
GROUP BY ContactName, dbo.get_FactureDetails(O.OrderID)

Bien cordialement
Med Bouchenafa



"jack" wrote in message
news:e9K$
Bonjour,
J'essaie d'écrire une requête sans passer par des curseurs mais je ne sais
pas si je peux obtenir le résultat que je souhaite.
J'ai 3 tables CLIENTS, FACTURE,LIGNE_FACTURE

Je fais un

select r.cliID, r.client, sum(r.ht) as ht from
(
SELECT
fl.FLIG_ID as ligneFactID
,fl.FACT_ID as factID
,fl.FLIG_TOTALHT as ht
,c.CLIE_ID as cliID
,c.CLIE_NOM as client

from facture_ligne fl
inner join facture f on f.FACT_ID=fl.FACT_ID
inner join client c on c.CLIE_ID=f.CLIE_ID

where fl... (là les critères varient)
) r

group by r.CLIID,r.client

Ce que j'aimerais obtenir c'est une colonne supplémentaire dans le
résultat
final avec, par client, les id des lignes de factures (concaténés)
retournées par la requete

Quelque chose du genre

select r.cliID, r.client, sum(r.ht) as ht, idLignes =(1,23,45,567,...)
from
...
CE qui donnerait comme résultat

cliID client ht IDLignes
1 Durand 1000 1,23,45
2 Dupond 245 2,67,98
3 Dupuis 500 3, 27, 123

etc, etc,

Est-ce possible directement par une requête ?

Merci




Avatar
Med Bouchenafa
Voici une solution encore plus elegante

SELECT Client = C.ContactName,
Commande = O.OrderID,
List = D.a
FROM dbo.Customers C INNER JOIN dbo.Orders O ON C.CustomerID = O.CustomerID
CROSS APPLY( SELECT
CAST(X.OrderDetailsID AS VARCHAR(8)) + ','
FROM
dbo.OrderDetails X
WHERE
X.OrderID = O.OrderID
FOR XML
PATH('')
) D (a)

Je me suis bien amusé....

Bien cordialement
Med Bouchenafa

"jack" wrote in message
news:e9K$
Bonjour,
J'essaie d'écrire une requête sans passer par des curseurs mais je ne sais
pas si je peux obtenir le résultat que je souhaite.
J'ai 3 tables CLIENTS, FACTURE,LIGNE_FACTURE

Je fais un

select r.cliID, r.client, sum(r.ht) as ht from
(
SELECT
fl.FLIG_ID as ligneFactID
,fl.FACT_ID as factID
,fl.FLIG_TOTALHT as ht
,c.CLIE_ID as cliID
,c.CLIE_NOM as client

from facture_ligne fl
inner join facture f on f.FACT_ID=fl.FACT_ID
inner join client c on c.CLIE_ID=f.CLIE_ID

where fl... (là les critères varient)
) r

group by r.CLIID,r.client

Ce que j'aimerais obtenir c'est une colonne supplémentaire dans le
résultat
final avec, par client, les id des lignes de factures (concaténés)
retournées par la requete

Quelque chose du genre

select r.cliID, r.client, sum(r.ht) as ht, idLignes =(1,23,45,567,...)
from
...
CE qui donnerait comme résultat

cliID client ht IDLignes
1 Durand 1000 1,23,45
2 Dupond 245 2,67,98
3 Dupuis 500 3, 27, 123

etc, etc,

Est-ce possible directement par une requête ?

Merci




Avatar
jack
Merci Med,

Content de t'avoir distrait.

Qui tu sais de chez Linux...

"Med Bouchenafa" wrote in message
news:
Voici une solution encore plus elegante

SELECT Client = C.ContactName,
Commande = O.OrderID,
List = D.a
FROM dbo.Customers C INNER JOIN dbo.Orders O ON C.CustomerID O.CustomerID
CROSS APPLY( SELECT
CAST(X.OrderDetailsID AS VARCHAR(8)) + ','
FROM
dbo.OrderDetails X
WHERE
X.OrderID = O.OrderID
FOR XML
PATH('')
) D (a)

Je me suis bien amusé....

Bien cordialement
Med Bouchenafa

"jack" wrote in message
news:e9K$
> Bonjour,
> J'essaie d'écrire une requête sans passer par des curseurs mais je ne


sais
> pas si je peux obtenir le résultat que je souhaite.
> J'ai 3 tables CLIENTS, FACTURE,LIGNE_FACTURE
>
> Je fais un
>
> select r.cliID, r.client, sum(r.ht) as ht from
> (
> SELECT
> fl.FLIG_ID as ligneFactID
> ,fl.FACT_ID as factID
> ,fl.FLIG_TOTALHT as ht
> ,c.CLIE_ID as cliID
> ,c.CLIE_NOM as client
>
> from facture_ligne fl
> inner join facture f on f.FACT_ID=fl.FACT_ID
> inner join client c on c.CLIE_ID=f.CLIE_ID
>
> where fl... (là les critères varient)
> ) r
>
> group by r.CLIID,r.client
>
> Ce que j'aimerais obtenir c'est une colonne supplémentaire dans le
> résultat
> final avec, par client, les id des lignes de factures (concaténés)
> retournées par la requete
>
> Quelque chose du genre
>
> select r.cliID, r.client, sum(r.ht) as ht, idLignes =(1,23,45,567,...)
> from
> ...
> CE qui donnerait comme résultat
>
> cliID client ht


IDLignes
> 1 Durand 1000 1,23,45
> 2 Dupond 245 2,67,98
> 3 Dupuis 500 3, 27, 123
>
> etc, etc,
>
> Est-ce possible directement par une requête ?
>
> Merci
>
>