Je pensais pas être si nul en SQL ...

Le
laurent chauvin
Bonjour à tous, et merci à vous de faire vivre ce forum :

J'ai une table S_HISTO_OPERATION comme suit :

Name Null? Type
- -- -
ID_HISTO_OPERATION NOT NULL NUMBER(10)
ID_CONTRAT NOT NULL NUMBER(12)
NUM_TRANSAC NOT NULL NUMBER(10)
TYPE_OPERATION NOT NULL VARCHAR2(2)
DTHR_OPERATION NOT NULL DATE
SOLDE_RESTANT NUMBER(10)


au niveau des cardinalités :

pour 1 contrat j'ai les 5 dernieres transactions, et pour chaque
enregistrement : un id, le type, la date, le solde

je cherche à isoler à ne retourner qu'une seule ligne par
contrat avec le détail de la dernière transaction :

soit avec le max(dthr_operation), ou le max(num_transac) ou encore le
min(solde_restant)

je fais sans doute une mauvaise utilisation du GROUP BY :

SELECT
ID_HISTO_OPERATION,
ID_CONTRAT,
NUM_TRANSAC,
max(DTHR_OPERATION),
SOLDE_RESTANT
FROM S_HISTO_OPERATION
where id_contrat < 12000
group by ID_CONTRAT,
SOLDE_RESTANT,
ID_HISTO_OPERATION,
NUM_TRANSAC

cette requete me ramène les 5 et pas la dernière opération !


En fait cela ne fonctionne uniquement si je select l'id_contrat avec
le max ou le min des champs cités plus haut !

comme cà :

SELECT
ID_CONTRAT,
max(DTHR_OPERATION)
FROM S_HISTO_OPERATION
where id_contrat < 12000
group by ID_CONTRAT

là effectivement il ne me ramène qu'une seule ligne ! ca marche aussi
avec le min(solde_restant) mais je peux pas avoir les 2 sur une même
ligne !

Quelqu'un a-t-il une solution ?
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fred BROUARD - SQLpro
Le #21711701
Il faut faire une sous requête corrélée... :

SELECT *
FROM S_HISTO_OPERATION S1
WHERE DTHR_OPERATION = (SELECT MAX(DTHR_OPERATION)
FROM S_HISTO_OPERATION S2
WHERE S2.ID_CONTRAT = S1.ID_CONTRAT)

Tu n'a pas dit quel était la clef.
J'ai supposé que la clef est : ID_CONTRAT + ID_HISTO_OPERATION

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 *************************

laurent chauvin a écrit:
Bonjour à tous, et merci à vous de faire vivre ce forum :

J'ai une table S_HISTO_OPERATION comme suit :

Name Null? Type
------------------------------- -------- ----
ID_HISTO_OPERATION NOT NULL NUMBER(10)
ID_CONTRAT NOT NULL NUMBER(12)
NUM_TRANSAC NOT NULL NUMBER(10)
TYPE_OPERATION NOT NULL VARCHAR2(2)
DTHR_OPERATION NOT NULL DATE
SOLDE_RESTANT NUMBER(10)


au niveau des cardinalités :

pour 1 contrat j'ai les 5 dernieres transactions, et pour chaque
enregistrement : un id, le type, la date, le solde

je cherche à isoler à ne retourner qu'une seule ligne par
contrat avec le détail de la dernière transaction :

soit avec le max(dthr_operation), ou le max(num_transac) ou encore le
min(solde_restant)

je fais sans doute une mauvaise utilisation du GROUP BY :

SELECT
ID_HISTO_OPERATION,
ID_CONTRAT,
NUM_TRANSAC,
max(DTHR_OPERATION),
SOLDE_RESTANT
FROM S_HISTO_OPERATION
where id_contrat < 12000
group by ID_CONTRAT,
SOLDE_RESTANT,
ID_HISTO_OPERATION,
NUM_TRANSAC

cette requete me ramène les 5 et pas la dernière opération !


En fait cela ne fonctionne uniquement si je select l'id_contrat avec
le max ou le min des champs cités plus haut !

comme cà :

SELECT
ID_CONTRAT,
max(DTHR_OPERATION)
FROM S_HISTO_OPERATION
where id_contrat < 12000
group by ID_CONTRAT

là effectivement il ne me ramène qu'une seule ligne ! ca marche aussi
avec le min(solde_restant) mais je peux pas avoir les 2 sur une même
ligne !

Quelqu'un a-t-il une solution ?


Francois
Le #21711691
laurent chauvin a écrit :
Bonjour à tous, et merci à vous de faire vivre ce forum :


Bonjour,
SELECT
ID_HISTO_OPERATION,
ID_CONTRAT,
NUM_TRANSAC,
max(DTHR_OPERATION),
SOLDE_RESTANT
FROM S_HISTO_OPERATION
where id_contrat < 12000
group by ID_CONTRAT,
SOLDE_RESTANT,
ID_HISTO_OPERATION,
NUM_TRANSAC

cette requete me ramène les 5 et pas la dernière opération !


Logique, il cherche des combinaisons uniques de ID-CONTRAT,
SOLDE_RESTANT, ID_HISTO_OPERATION et NUM_TRANSAC pour faire le groupage.
Il faut dissocier la requête sortant les infos et la requête
sélectionnant tes max(DTHR_OPERATION)


En fait cela ne fonctionne uniquement si je select l'id_contrat avec
le max ou le min des champs cités plus haut !

comme cà :

SELECT
ID_CONTRAT,
max(DTHR_OPERATION)
FROM S_HISTO_OPERATION
where id_contrat < 12000
group by ID_CONTRAT


logique aussi, là tu trouves la liste qui t'intéresse, mais évidemment
il te manque des infos par rapport à ta requête de départ.

là effectivement il ne me ramène qu'une seule ligne ! ca marche aussi
avec le min(solde_restant) mais je peux pas avoir les 2 sur une même
ligne !

Quelqu'un a-t-il une solution ?


La requête imbriquée... mais ceci ne fonctionne pas sur des SGBD allégés
comme MySql:
SELECT
ID_HISTO_OPERATION,
ID_CONTRAT,
NUM_TRANSAC,
DTHR_OPERATION,
SOLDE_RESTANT
FROM S_HISTO_OPERATION as SHO1
where not exists (
select *
from S_HISTO_OPERATION as SHO2
where SHO2.ID_CONTRAT = SHO1.ID_CONTRAT)
and SHO2.DTHR_OPERATION > SHO1.DTHR_OPERATION)

Suivant ton SGBD tu devras peut-être remplacer les "as" par un espace
simple.

Attention, c'est plutôt lourd dès qu'on touche aux requêtes imbriquées. --
Francois Guechoum
http://francois.guechoum.free.fr
Igor Racic
Le #21711671
Bonjour,

Si j'ai bien compris, tu cherche pour chaque id_contrat la ligne avec
max(DTHR_OPERATION).

Avec fonctions analitiques ( Oracle vérsion >= 8i ):

select ID_CONTRAT, ID_HISTO_OPERATION, NUM_TRANSAC, SOLDE_RESTANT
from
( select ID_CONTRAT, ID_HISTO_OPERATION, NUM_TRANSAC, DTHR_OPERATION,
SOLDE_RESTANT, max( DTHR_OPERATION ) over ( partition by ID_CONTRAT )
max_dthr_operation
from S_HISTO_OPERATION
)
where DTHR_OPERATION = max_dthr_operation ;


Si, j'ai pas bien compris, donne un example avec les données et sortie
que tu veux...


Igor






select ID_CONTRAT,
laurent chauvin wrote:
Bonjour à tous, et merci à vous de faire vivre ce forum :

J'ai une table S_HISTO_OPERATION comme suit :

Name Null? Type
------------------------------- -------- ----
ID_HISTO_OPERATION NOT NULL NUMBER(10)
ID_CONTRAT NOT NULL NUMBER(12)
NUM_TRANSAC NOT NULL NUMBER(10)
TYPE_OPERATION NOT NULL VARCHAR2(2)
DTHR_OPERATION NOT NULL DATE
SOLDE_RESTANT NUMBER(10)


au niveau des cardinalités :

pour 1 contrat j'ai les 5 dernieres transactions, et pour chaque
enregistrement : un id, le type, la date, le solde

je cherche à isoler à ne retourner qu'une seule ligne par
contrat avec le détail de la dernière transaction :

soit avec le max(dthr_operation), ou le max(num_transac) ou encore le
min(solde_restant)

je fais sans doute une mauvaise utilisation du GROUP BY :

SELECT
ID_HISTO_OPERATION,
ID_CONTRAT,
NUM_TRANSAC,
max(DTHR_OPERATION),
SOLDE_RESTANT
FROM S_HISTO_OPERATION
where id_contrat < 12000
group by ID_CONTRAT,
SOLDE_RESTANT,
ID_HISTO_OPERATION,
NUM_TRANSAC

cette requete me ramène les 5 et pas la dernière opération !


En fait cela ne fonctionne uniquement si je select l'id_contrat avec
le max ou le min des champs cités plus haut !

comme cà :

SELECT
ID_CONTRAT,
max(DTHR_OPERATION)
FROM S_HISTO_OPERATION
where id_contrat < 12000
group by ID_CONTRAT

là effectivement il ne me ramène qu'une seule ligne ! ca marche aussi
avec le min(solde_restant) mais je peux pas avoir les 2 sur une même
ligne !

Quelqu'un a-t-il une solution ?


laurent chauvin
Le #21711501
çà marche à merveille ! Fred Brouard is really the best ( et je le pense !
... en parcourant les réponses de ce newsgroup, on retrouve toujours
la précision et la qualité des réponses de notre ami Fred ! )

encore merci !


"Fred BROUARD - SQLpro" de news:
Il faut faire une sous requête corrélée... :

SELECT *
FROM S_HISTO_OPERATION S1
WHERE DTHR_OPERATION = (SELECT MAX(DTHR_OPERATION)
FROM S_HISTO_OPERATION S2
WHERE S2.ID_CONTRAT = S1.ID_CONTRAT)

Tu n'a pas dit quel était la clef.
J'ai supposé que la clef est : ID_CONTRAT + ID_HISTO_OPERATION

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 *************************

laurent chauvin a écrit:
> Bonjour à tous, et merci à vous de faire vivre ce forum :
>
> J'ai une table S_HISTO_OPERATION comme suit :
>
> Name Null? Type
> ------------------------------- -------- ----
> ID_HISTO_OPERATION NOT NULL NUMBER(10)
> ID_CONTRAT NOT NULL NUMBER(12)
> NUM_TRANSAC NOT NULL NUMBER(10)
> TYPE_OPERATION NOT NULL VARCHAR2(2)
> DTHR_OPERATION NOT NULL DATE
> SOLDE_RESTANT NUMBER(10)
>
>
> au niveau des cardinalités :
>
> pour 1 contrat j'ai les 5 dernieres transactions, et pour chaque
> enregistrement : un id, le type, la date, le solde
>
> je cherche à isoler à ne retourner qu'une seule ligne par
> contrat avec le détail de la dernière transaction :
>
> soit avec le max(dthr_operation), ou le max(num_transac) ou encore le
> min(solde_restant)
>
> je fais sans doute une mauvaise utilisation du GROUP BY :
>
> SELECT
> ID_HISTO_OPERATION,
> ID_CONTRAT,
> NUM_TRANSAC,
> max(DTHR_OPERATION),
> SOLDE_RESTANT
> FROM S_HISTO_OPERATION
> where id_contrat < 12000
> group by ID_CONTRAT,
> SOLDE_RESTANT,
> ID_HISTO_OPERATION,
> NUM_TRANSAC
>
> cette requete me ramène les 5 et pas la dernière opération !
>
>
> En fait cela ne fonctionne uniquement si je select l'id_contrat avec
> le max ou le min des champs cités plus haut !
>
> comme cà :
>
> SELECT
> ID_CONTRAT,
> max(DTHR_OPERATION)
> FROM S_HISTO_OPERATION
> where id_contrat < 12000
> group by ID_CONTRAT
>
> là effectivement il ne me ramène qu'une seule ligne ! ca marche aussi
> avec le min(solde_restant) mais je peux pas avoir les 2 sur une même
> ligne !
>
> Quelqu'un a-t-il une solution ?
>
>

Publicité
Poster une réponse
Anonyme