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 !
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
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 ?
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 !
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
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
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
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
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 ?
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 !
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
çà 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" a écrit dans le message 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 ? > >
çà 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" <brouardf@club-internet.fr> a écrit dans le message
de news: 409B726D.1050405@club-internet.fr...
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 ?
>
>
çà 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" a écrit dans le message 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 ? > >