Ecriture d'une requête

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Med Bouchenafa
Le #19093591
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" 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




Med Bouchenafa
Le #19094341
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" 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




jack
Le #19096641
Merci Med,

Content de t'avoir distrait.

Qui tu sais de chez Linux...

"Med Bouchenafa" 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" 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
>
>



Publicité
Poster une réponse
Anonyme