OVH Cloud OVH Cloud

Requête

6 réponses
Avatar
Mélanie
Bonjour,
J'ai une requ=EAte en pl-sql que je veux utiliser en=20
transact-sql mais je n'y arrive pas.........

SELECT IAFE01_H.id_peine_defnd
=20
FROM=20
=09
(SELECT DISTINCT id_peine_defnd,
=09
FIRST_VALUE(in_crean_potnt_non_reals) OVER=20
(PARTITION BY id_peine_defnd order by id_trans_fincr=20
desc ) as=20
in_crean_potnt_non_reals
=09
=09
=09
FROM IAFE01_TRANS_FINCR=20
=20
=09
WHERE TRUNC(dh_creat) <=3D TO_DATE
('20040731','RRRRMMDD')
=09
) IAFE01_H
=20
WHERE IAFE01_H.in_crean_potnt_non_reals =3D 'N'



Est-ce que quelqu'un peut m'aider??
Merci beaucoup,
M=E9lanie

6 réponses

Avatar
Mélanie
Bonjour,
Je crois que je n'ai pas donné assez de détails et que ma
requête était plutôt dificile à lire. C'est la ligne où
il y a la fonction first_value que j'ai de la difficulté
à transformer en requête transact-sql. Voici ma requête
que je dois transformer:
SELECT IAFE01_H.id_peine_defnd
FROM
(
SELECT DISTINCT id_peine_defnd,
(select top 1 in_crean_potnt_non_reals FROM
IAFE01_TRANS_FINCR group by
id_peine_defnd,in_crean_potnt_non_reals,id_trans_fincr
order by id_trans_fincr desc )
as in_crean_potnt_non_reals
FROM IAFE01_TRANS_FINCR
WHERE dh_creat <= @Date
) IAFE01_H
WHERE IAFE01_H.in_crean_potnt_non_reals = 'N'

Merci à l'avance de votre aide,
Mélanie



-----Message d'origine-----
Bonjour,
J'ai une requête en pl-sql que je veux utiliser en
transact-sql mais je n'y arrive pas.........

SELECT IAFE01_H.id_peine_defnd

FROM

(SELECT DISTINCT id_peine_defnd,

FIRST_VALUE(in_crean_potnt_non_reals) OVER
(PARTITION BY id_peine_defnd order by id_trans_fincr
desc ) as
in_crean_potnt_non_reals



FROM IAFE01_TRANS_FINCR


WHERE TRUNC(dh_creat) <= TO_DATE
('20040731','RRRRMMDD')

) IAFE01_H

WHERE IAFE01_H.in_crean_potnt_non_reals = 'N'



Est-ce que quelqu'un peut m'aider??
Merci beaucoup,
Mélanie
.



Avatar
Sylvain Lafontaine
Le problème aussi c'est qu'à peu près personne ne connaît le PL-SQL. Vous
devriez d'abord nous dire qu'elle est la fonction de l'instruction OVER
PARTITION et quel est le but de cette requête.

S. L.

"Mélanie" wrote in message
news:297b01c4ad31$6af1c9d0$
Bonjour,
Je crois que je n'ai pas donné assez de détails et que ma
requête était plutôt dificile à lire. C'est la ligne où
il y a la fonction first_value que j'ai de la difficulté
à transformer en requête transact-sql. Voici ma requête
que je dois transformer:
SELECT IAFE01_H.id_peine_defnd
FROM
(
SELECT DISTINCT id_peine_defnd,
(select top 1 in_crean_potnt_non_reals FROM
IAFE01_TRANS_FINCR group by
id_peine_defnd,in_crean_potnt_non_reals,id_trans_fincr
order by id_trans_fincr desc )
as in_crean_potnt_non_reals
FROM IAFE01_TRANS_FINCR
WHERE dh_creat <= @Date
) IAFE01_H
WHERE IAFE01_H.in_crean_potnt_non_reals = 'N'

Merci à l'avance de votre aide,
Mélanie



-----Message d'origine-----
Bonjour,
J'ai une requête en pl-sql que je veux utiliser en
transact-sql mais je n'y arrive pas.........

SELECT IAFE01_H.id_peine_defnd

FROM

(SELECT DISTINCT id_peine_defnd,

FIRST_VALUE(in_crean_potnt_non_reals) OVER
(PARTITION BY id_peine_defnd order by id_trans_fincr
desc ) as
in_crean_potnt_non_reals



FROM IAFE01_TRANS_FINCR


WHERE TRUNC(dh_creat) <= TO_DATE
('20040731','RRRRMMDD')

) IAFE01_H

WHERE IAFE01_H.in_crean_potnt_non_reals = 'N'



Est-ce que quelqu'un peut m'aider??
Merci beaucoup,
Mélanie
.



Avatar
Steve Kass
Sylvain,

Votre requête est peut-être equivalent à une de ces deux?

select distinct T1.id_peine_defnd
from IAFE01_TRANS_FINCR T1
where dh_creat < '20040801'
and (
select top 1 T2.in_crean_potnt_non_reals
from IAFE01_TRANS_FINCR T2
where T1.id_peine_defnd = T2.id_peine_defnd
and T2.dh_creat < '20040801'
order by T2.id_trans_fincr desc
) = 'N'

ou

select distinct T1.id_peine_defnd
from IAFE01_TRANS_FINCR T1
where dh_creat < '20040801'
and not exists (
select * top 1 T2.in_crean_potnt_non_reals
from IAFE01_TRANS_FINCR T2
where T1.id_peine_defnd = T2.id_peine_defnd
and T2.id_trans_fincr > T1.id_trans_fincr
and T2.dh_creat < '20040801'
and T2.in_crean_potnt_non_reals <> 'N'
)

Steve Kass
Drew University

Sylvain Lafontaine wrote:

Le problème aussi c'est qu'à peu près personne ne connaît le PL-SQL. Vous
devriez d'abord nous dire qu'elle est la fonction de l'instruction OVER
PARTITION et quel est le but de cette requête.

S. L.

"Mélanie" wrote in message
news:297b01c4ad31$6af1c9d0$
Bonjour,
Je crois que je n'ai pas donné assez de détails et que ma
requête était plutôt dificile à lire. C'est la ligne où
il y a la fonction first_value que j'ai de la difficulté
à transformer en requête transact-sql. Voici ma requête
que je dois transformer:
SELECT IAFE01_H.id_peine_defnd
FROM
(
SELECT DISTINCT id_peine_defnd,
(select top 1 in_crean_potnt_non_reals FROM
IAFE01_TRANS_FINCR group by
id_peine_defnd,in_crean_potnt_non_reals,id_trans_fincr
order by id_trans_fincr desc )
as in_crean_potnt_non_reals
FROM IAFE01_TRANS_FINCR
WHERE dh_creat <= @Date
) IAFE01_H
WHERE IAFE01_H.in_crean_potnt_non_reals = 'N'

Merci à l'avance de votre aide,
Mélanie





-----Message d'origine-----
Bonjour,
J'ai une requête en pl-sql que je veux utiliser en
transact-sql mais je n'y arrive pas.........

SELECT IAFE01_H.id_peine_defnd

FROM

(SELECT DISTINCT id_peine_defnd,

FIRST_VALUE(in_crean_potnt_non_reals) OVER
(PARTITION BY id_peine_defnd order by id_trans_fincr
desc ) as
in_crean_potnt_non_reals



FROM IAFE01_TRANS_FINCR


WHERE TRUNC(dh_creat) <= TO_DATE
('20040731','RRRRMMDD')

) IAFE01_H

WHERE IAFE01_H.in_crean_potnt_non_reals = 'N'



Est-ce que quelqu'un peut m'aider??
Merci beaucoup,
Mélanie
.











Avatar
Sylvain Lafontaine
Aucune idée.

Dans la requête initiale de Mélanie, il y a une instruction PARTITION BY
dont je ne connais pas la nature. On ne connaît pas non plus l'idée
générale derrière cette requête, puisque la structure globale des tables
nous est également inconnue.

S. L.

"Steve Kass" wrote in message
news:u$
Sylvain,

Votre requête est peut-être equivalent à une de ces deux?

select distinct T1.id_peine_defnd
from IAFE01_TRANS_FINCR T1
where dh_creat < '20040801'
and (
select top 1 T2.in_crean_potnt_non_reals
from IAFE01_TRANS_FINCR T2
where T1.id_peine_defnd = T2.id_peine_defnd
and T2.dh_creat < '20040801'
order by T2.id_trans_fincr desc
) = 'N'

ou

select distinct T1.id_peine_defnd
from IAFE01_TRANS_FINCR T1
where dh_creat < '20040801'
and not exists (
select * top 1 T2.in_crean_potnt_non_reals
from IAFE01_TRANS_FINCR T2
where T1.id_peine_defnd = T2.id_peine_defnd
and T2.id_trans_fincr > T1.id_trans_fincr
and T2.dh_creat < '20040801'
and T2.in_crean_potnt_non_reals <> 'N'
)

Steve Kass
Drew University

Sylvain Lafontaine wrote:

Le problème aussi c'est qu'à peu près personne ne connaît le PL-SQL. Vous
devriez d'abord nous dire qu'elle est la fonction de l'instruction OVER
PARTITION et quel est le but de cette requête.

S. L.

"Mélanie" wrote in message
news:297b01c4ad31$6af1c9d0$
Bonjour,
Je crois que je n'ai pas donné assez de détails et que ma
requête était plutôt dificile à lire. C'est la ligne où
il y a la fonction first_value que j'ai de la difficulté
à transformer en requête transact-sql. Voici ma requête
que je dois transformer:
SELECT IAFE01_H.id_peine_defnd
FROM
(
SELECT DISTINCT id_peine_defnd,
(select top 1 in_crean_potnt_non_reals FROM
IAFE01_TRANS_FINCR group by
id_peine_defnd,in_crean_potnt_non_reals,id_trans_fincr
order by id_trans_fincr desc )
as in_crean_potnt_non_reals
FROM IAFE01_TRANS_FINCR
WHERE dh_creat <= @Date
) IAFE01_H
WHERE IAFE01_H.in_crean_potnt_non_reals = 'N'

Merci à l'avance de votre aide,
Mélanie




-----Message d'origine-----
Bonjour,
J'ai une requête en pl-sql que je veux utiliser en
transact-sql mais je n'y arrive pas.........

SELECT IAFE01_H.id_peine_defnd

FROM

(SELECT DISTINCT id_peine_defnd,

FIRST_VALUE(in_crean_potnt_non_reals) OVER
(PARTITION BY id_peine_defnd order by id_trans_fincr
desc ) as
in_crean_potnt_non_reals



FROM IAFE01_TRANS_FINCR


WHERE TRUNC(dh_creat) <= TO_DATE
('20040731','RRRRMMDD')

) IAFE01_H

WHERE IAFE01_H.in_crean_potnt_non_reals = 'N'



Est-ce que quelqu'un peut m'aider??
Merci beaucoup,
Mélanie
.











Avatar
Mel
Bonjour Steve,
En fait, ce que je veux c'est reproduire la fonction FIRST_VALUE d'Oracle.
Donc, je veux un enregistrement UNIQUE contenant un ID ainsi qu'un montant.
Ce montant est le premier que je rencontre pour le ID car dans ma requête je
dois d'abord grouper par ID puis trier en fonction d'une date. Ainsi, le
premier montant que je rencontre pour le ID est celui qui est le plus proche
de la date en question.
Je rencontre cependant différents problèmes:

Le order by prime sur le group by ce qui fait que mes ID ne sont pas
nécessairement à la suite...

Le top 1 ne fonctionne pas puisqu'il sélectionne uniquement le premier
enregistrement alors que moi je veux le premier mais pour chacun des ID (donc
chacun de mes groupes) et le premier montant rencontré n'est pas
nécessairement le plus petit, c'est celui dont la date est la plus proche.

De plus, les colonnes spécifiées dans la clause order by doivent être dans
le SELECT à cause du DISTINCT.

Les problèmes que je rencontre ne se posent pas avec la clause FIRST_VALUE
mais je dois travailler en transact-sql pour trouver quelque chose
d'équivalent.......

Je n'ai toujours pas trouvé de sollution alors si quelqu'un peut m'aider ;)

Un gros merci!
Mélanie
"Steve Kass" wrote:

Sylvain,

Votre requête est peut-être equivalent à une de ces deux?

select distinct T1.id_peine_defnd
from IAFE01_TRANS_FINCR T1
where dh_creat < '20040801'
and (
select top 1 T2.in_crean_potnt_non_reals
from IAFE01_TRANS_FINCR T2
where T1.id_peine_defnd = T2.id_peine_defnd
and T2.dh_creat < '20040801'
order by T2.id_trans_fincr desc
) = 'N'

ou

select distinct T1.id_peine_defnd
from IAFE01_TRANS_FINCR T1
where dh_creat < '20040801'
and not exists (
select * top 1 T2.in_crean_potnt_non_reals
from IAFE01_TRANS_FINCR T2
where T1.id_peine_defnd = T2.id_peine_defnd
and T2.id_trans_fincr > T1.id_trans_fincr
and T2.dh_creat < '20040801'
and T2.in_crean_potnt_non_reals <> 'N'
)

Steve Kass
Drew University

Sylvain Lafontaine wrote:

>Le problème aussi c'est qu'à peu près personne ne connaît le PL-SQL. Vous
>devriez d'abord nous dire qu'elle est la fonction de l'instruction OVER
>PARTITION et quel est le but de cette requête.
>
>S. L.
>
>"Mélanie" wrote in message
>news:297b01c4ad31$6af1c9d0$
>Bonjour,
>Je crois que je n'ai pas donné assez de détails et que ma
>requête était plutôt dificile à lire. C'est la ligne où
>il y a la fonction first_value que j'ai de la difficulté
>à transformer en requête transact-sql. Voici ma requête
>que je dois transformer:
>SELECT IAFE01_H.id_peine_defnd
>FROM
>(
> SELECT DISTINCT id_peine_defnd,
> (select top 1 in_crean_potnt_non_reals FROM
> IAFE01_TRANS_FINCR group by
> id_peine_defnd,in_crean_potnt_non_reals,id_trans_fincr
>order by id_trans_fincr desc )
>as in_crean_potnt_non_reals
> FROM IAFE01_TRANS_FINCR
> WHERE dh_creat <= @Date
>) IAFE01_H
>WHERE IAFE01_H.in_crean_potnt_non_reals = 'N'
>
>Merci à l'avance de votre aide,
>Mélanie
>
>
>
>
>
>>-----Message d'origine-----
>>Bonjour,
>>J'ai une requête en pl-sql que je veux utiliser en
>>transact-sql mais je n'y arrive pas.........
>>
>>SELECT IAFE01_H.id_peine_defnd
>>
>>FROM
>>
>> (SELECT DISTINCT id_peine_defnd,
>>
>> FIRST_VALUE(in_crean_potnt_non_reals) OVER
>>(PARTITION BY id_peine_defnd order by id_trans_fincr
>>desc ) as
>>in_crean_potnt_non_reals
>>
>>
>>
>>FROM IAFE01_TRANS_FINCR
>>
>>
>> WHERE TRUNC(dh_creat) <= TO_DATE
>>('20040731','RRRRMMDD')
>>
>> ) IAFE01_H
>>
>>WHERE IAFE01_H.in_crean_potnt_non_reals = 'N'
>>
>>
>>
>>Est-ce que quelqu'un peut m'aider??
>>Merci beaucoup,
>>Mélanie
>>.
>>
>>
>>
>
>
>
>



Avatar
Sylvain Lafontaine
Ce genre de problème se résout en général assez bien en utilisant les
sous-requêtes. J'imagine que PARTITION signifie la même chose qu'une
sous-requête.

Solution: dans votre première requête, trouver le ID et la date la plus
proche:

select Id, Max (date)
from table1
group by Id

Transformez ensuite cette requête en sous-requête et aller chercher le
montant que vous avez besoin:

select t1.id, t1.date, t2.montant
from (select id, Max (date) from table1 group by id) as t1
inner join table2 t2 on (t1.id = t2.id and t1.date = t2.date)

Pour ce qui est de votre problème avec les colonnes supplémentaires que vous
ne pouvez mettre dans la clause Select, rajoutez-les dans la clause Group By
ou utilisez une sous-requête supplémentaire; ce qui va améliorer les
performances.

Par exemple, au lieu d'écrire:

Select id, First (Nom), First (Nom)
From table1
Group By id

Vous devez écrire:

Select id, Nom, Prenom
From table1
Group By id, Nom, Prenom

Ou:

select t1A.id, t1B.nom, t1B.prenom
from (select id from table1 group by id) as t1A inner join table1 t1B on
t1A.id = t1B.id

S. L.

"Mel" wrote in message
news:
Bonjour Steve,
En fait, ce que je veux c'est reproduire la fonction FIRST_VALUE d'Oracle.
Donc, je veux un enregistrement UNIQUE contenant un ID ainsi qu'un
montant.
Ce montant est le premier que je rencontre pour le ID car dans ma requête
je
dois d'abord grouper par ID puis trier en fonction d'une date. Ainsi, le
premier montant que je rencontre pour le ID est celui qui est le plus
proche
de la date en question.
Je rencontre cependant différents problèmes:

Le order by prime sur le group by ce qui fait que mes ID ne sont pas
nécessairement à la suite...

Le top 1 ne fonctionne pas puisqu'il sélectionne uniquement le premier
enregistrement alors que moi je veux le premier mais pour chacun des ID
(donc
chacun de mes groupes) et le premier montant rencontré n'est pas
nécessairement le plus petit, c'est celui dont la date est la plus proche.

De plus, les colonnes spécifiées dans la clause order by doivent être dans
le SELECT à cause du DISTINCT.

Les problèmes que je rencontre ne se posent pas avec la clause FIRST_VALUE
mais je dois travailler en transact-sql pour trouver quelque chose
d'équivalent.......

Je n'ai toujours pas trouvé de sollution alors si quelqu'un peut m'aider
;)

Un gros merci!
Mélanie
"Steve Kass" wrote:

Sylvain,

Votre requête est peut-être equivalent à une de ces deux?

select distinct T1.id_peine_defnd
from IAFE01_TRANS_FINCR T1
where dh_creat < '20040801'
and (
select top 1 T2.in_crean_potnt_non_reals
from IAFE01_TRANS_FINCR T2
where T1.id_peine_defnd = T2.id_peine_defnd
and T2.dh_creat < '20040801'
order by T2.id_trans_fincr desc
) = 'N'

ou

select distinct T1.id_peine_defnd
from IAFE01_TRANS_FINCR T1
where dh_creat < '20040801'
and not exists (
select * top 1 T2.in_crean_potnt_non_reals
from IAFE01_TRANS_FINCR T2
where T1.id_peine_defnd = T2.id_peine_defnd
and T2.id_trans_fincr > T1.id_trans_fincr
and T2.dh_creat < '20040801'
and T2.in_crean_potnt_non_reals <> 'N'
)

Steve Kass
Drew University

Sylvain Lafontaine wrote:

>Le problème aussi c'est qu'à peu près personne ne connaît le PL-SQL.
>Vous
>devriez d'abord nous dire qu'elle est la fonction de l'instruction OVER
>PARTITION et quel est le but de cette requête.
>
>S. L.
>
>"Mélanie" wrote in message
>news:297b01c4ad31$6af1c9d0$
>Bonjour,
>Je crois que je n'ai pas donné assez de détails et que ma
>requête était plutôt dificile à lire. C'est la ligne où
>il y a la fonction first_value que j'ai de la difficulté
>à transformer en requête transact-sql. Voici ma requête
>que je dois transformer:
>SELECT IAFE01_H.id_peine_defnd
>FROM
>(
> SELECT DISTINCT id_peine_defnd,
> (select top 1 in_crean_potnt_non_reals FROM
> IAFE01_TRANS_FINCR group by
> id_peine_defnd,in_crean_potnt_non_reals,id_trans_fincr
>order by id_trans_fincr desc )
>as in_crean_potnt_non_reals
> FROM IAFE01_TRANS_FINCR
> WHERE dh_creat <= @Date
>) IAFE01_H
>WHERE IAFE01_H.in_crean_potnt_non_reals = 'N'
>
>Merci à l'avance de votre aide,
>Mélanie
>
>
>
>
>
>>-----Message d'origine-----
>>Bonjour,
>>J'ai une requête en pl-sql que je veux utiliser en
>>transact-sql mais je n'y arrive pas.........
>>
>>SELECT IAFE01_H.id_peine_defnd
>>
>>FROM
>>
>> (SELECT DISTINCT id_peine_defnd,
>>
>> FIRST_VALUE(in_crean_potnt_non_reals) OVER
>>(PARTITION BY id_peine_defnd order by id_trans_fincr
>>desc ) as
>>in_crean_potnt_non_reals
>>
>>
>>
>>FROM IAFE01_TRANS_FINCR
>>
>>
>> WHERE TRUNC(dh_creat) <= TO_DATE
>>('20040731','RRRRMMDD')
>>
>> ) IAFE01_H
>>
>>WHERE IAFE01_H.in_crean_potnt_non_reals = 'N'
>>
>>
>>
>>Est-ce que quelqu'un peut m'aider??
>>Merci beaucoup,
>>Mélanie
>>.
>>
>>
>>
>
>
>
>