OVH Cloud OVH Cloud

[SQL] Avis aux SQLmans (mySQL post 4.1)

2 réponses
Avatar
Roumegou Eric
Pas les idées claires moi ce matin !!!
Sgbd MySQL 4.0.23 pre 4.1
Soit une table PEOPLE_RESULT avec entre autre les colonnes

RES_ID Identif
POD_ID Code periode
PPL_ID Id people
RES_VAL07 Points mois
RES_VAL08 Points cumulés au mois

donc j'ai dans cette table des points mensuels, un enreg par mois
POD_ID 200501,200402,200503 etc .. et par individu (PPL_ID).
et la Table PERIOD
POD_ID Id periode
POD_REFEXT Code periode (ex '200501')

Je veux calculer et màj dans RES_VAL08 les points cumulés à ce mois,
soit RES_VAL08 de 200503=Somme des points RES_VAL07 de 200501 à 200503
pour une periode de ref 200503.

Simplissime me dis-je en 1 requete cela doit être torché et je n'y
arrive pas.

Pour l'instant je passe par 3 temps.
1 - fetch sur la periode 200503 (pDeb)
SELECT PEOPLE_RESULT.RES_ID,PEOPLE_RESULT.PPL_ID,PEOPLE_RESULT.POD_ID
FROM PEOPLE_RESULT "+...
" INNER JOIN PERIOD ON PERIOD.POD_ID=PEOPLE_RESULT.POD_ID "+...
" WHERE PERIOD.POD_REFEXT ="+Quote(pDeb)+" AND PERIOD.LVL_ID=219
"+...
" ORDER BY PPL_ID"
2 - pour chaque PPL_ID, calcul de
SELECT SUM(RES_VAL07)AS VAL08 FROM PEOPLE_RESULT
INNER JOIN PERIOD ON PERIOD.POD_ID=PEOPLE_RESULT.POD_ID
WHERE PERIOD.POD_REFEXT BETWEEN '200501' AND '200503' AND
PERIOD.LVL_ID=219
WHERE PPL_ID="+PPL_ID
3 - update

Et franchement je pense qu'il y a mieux.

--
Eric Roumégou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)

2 réponses

Avatar
ManuPavy
Roumegou Eric wrote:

Pas les idées claires moi ce matin !!!
Sgbd MySQL 4.0.23 pre 4.1
Soit une table PEOPLE_RESULT avec entre autre les colonnes

RES_ID Identif
POD_ID Code periode
PPL_ID Id people
RES_VAL07 Points mois
RES_VAL08 Points cumulés au mois

donc j'ai dans cette table des points mensuels, un enreg par mois POD_ID
200501,200402,200503 etc .. et par individu (PPL_ID).
et la Table PERIOD
POD_ID Id periode
POD_REFEXT Code periode (ex '200501')

Je veux calculer et màj dans RES_VAL08 les points cumulés à ce mois,
soit RES_VAL08 de 200503=Somme des points RES_VAL07 de 200501 à 200503
pour une periode de ref 200503.

Simplissime me dis-je en 1 requete cela doit être torché et je n'y
arrive pas.

Pour l'instant je passe par 3 temps.
1 - fetch sur la periode 200503 (pDeb)
SELECT PEOPLE_RESULT.RES_ID,PEOPLE_RESULT.PPL_ID,PEOPLE_RESULT.POD_ID
FROM PEOPLE_RESULT "+...
" INNER JOIN PERIOD ON PERIOD.POD_ID=PEOPLE_RESULT.POD_ID "+...
" WHERE PERIOD.POD_REFEXT ="+Quote(pDeb)+" AND PERIOD.LVL_ID!9 "+...
" ORDER BY PPL_ID"
2 - pour chaque PPL_ID, calcul de
SELECT SUM(RES_VAL07)AS VAL08 FROM PEOPLE_RESULT
INNER JOIN PERIOD ON PERIOD.POD_ID=PEOPLE_RESULT.POD_ID
WHERE PERIOD.POD_REFEXT BETWEEN '200501' AND '200503' AND PERIOD.LVL_ID!9
WHERE PPL_ID="+PPL_ID
3 - update

Et franchement je pense qu'il y a mieux.




Pour les deux premieres etapes, je pense qu il est possible de les
rassembler par un group by :
select ...
inner join
inner join
where ...
group by PPL_ID
having PERIOD.POD_REFEXT BETWEEN '200501' AND '200503'
AND PERIOD.LVL_ID!9

Le problème est que ca te fera utiliser une double jointure (que Windev
ne supporte pas) et donc il te faudra passer par un
hRequeteSansCorrection (ou alors tu transformes ca dans un where)


Manu
Avatar
jacques.trepp
ManuPavy a pensé très fort :
Roumegou Eric wrote:

Pas les idées claires moi ce matin !!!
Sgbd MySQL 4.0.23 pre 4.1
Soit une table PEOPLE_RESULT avec entre autre les colonnes

RES_ID Identif
POD_ID Code periode
PPL_ID Id people
RES_VAL07 Points mois
RES_VAL08 Points cumulés au mois

donc j'ai dans cette table des points mensuels, un enreg par mois POD_ID
200501,200402,200503 etc .. et par individu (PPL_ID).
et la Table PERIOD
POD_ID Id periode
POD_REFEXT Code periode (ex '200501')

Je veux calculer et màj dans RES_VAL08 les points cumulés à ce mois, soit
RES_VAL08 de 200503=Somme des points RES_VAL07 de 200501 à 200503 pour une
periode de ref 200503.

Simplissime me dis-je en 1 requete cela doit être torché et je n'y arrive
pas.

Pour l'instant je passe par 3 temps.
1 - fetch sur la periode 200503 (pDeb)
SELECT PEOPLE_RESULT.RES_ID,PEOPLE_RESULT.PPL_ID,PEOPLE_RESULT.POD_ID FROM
PEOPLE_RESULT "+...
" INNER JOIN PERIOD ON PERIOD.POD_ID=PEOPLE_RESULT.POD_ID "+...
" WHERE PERIOD.POD_REFEXT ="+Quote(pDeb)+" AND PERIOD.LVL_ID!9 "+...
" ORDER BY PPL_ID"
2 - pour chaque PPL_ID, calcul de
SELECT SUM(RES_VAL07)AS VAL08 FROM PEOPLE_RESULT
INNER JOIN PERIOD ON PERIOD.POD_ID=PEOPLE_RESULT.POD_ID
WHERE PERIOD.POD_REFEXT BETWEEN '200501' AND '200503' AND PERIOD.LVL_ID!9
WHERE PPL_ID="+PPL_ID
3 - update

Et franchement je pense qu'il y a mieux.




Pour les deux premieres etapes, je pense qu il est possible de les rassembler
par un group by :
select ...
inner join
inner join
where ...
group by PPL_ID
having PERIOD.POD_REFEXT BETWEEN '200501' AND '200503'
AND PERIOD.LVL_ID!9

Le problème est que ca te fera utiliser une double jointure (que Windev ne
supporte pas) et donc il te faudra passer par un hRequeteSansCorrection (ou
alors tu transformes ca dans un where)


Manu



Il est hautement probable qu'Eric n'utilise pas l'accès natif de Windev
;o)

--
Jacques Trepp
Albygest