Requête UNION et cumul

Bonjour.

Très novice dans les requêtes UNION, voici mon problème…

J’ai deux tables T_MISSIONS et T_VACATIONS qui contiennent le même nombre de colonnes de même nature.

Pour simplifier…

MIS_ID
MIS_DATE
MIS_HEURES

VAC_ID
VAC_DATE
VAC_HEURES

Après extraction du mois et de l’année dans les deux tables, ce que je voudrais c’est regrouper le nombre d’heures total (des deux tables), par année et par mois.

J’ai fait un petit essai (juste avec les heures pour commencer) :

SELECT SUM(MIS_HEURES) AS HEURES FROM T_MISSIONS
UNION
SELECT SUM(VAC_HEURES) AS HEURES FROM T_VACATIONS

J’obtiens bien le total mais sur deux lignes alors que je voudrais qu’elles soient cumulées sur une seule.

Merci de votre aide.

select sum(hr) from (
   select m as hr from TM
  union
   select v as hr from TV
 )

:warning: selon la base de données utilisée, le support des requêtes imbriquées peut varier. par ex.

Eh bien merci… :slightly_smiling_face:

Je rouvre le sujet parce que je ne m’en sors pas ; c’était facile avec deux lignes mais beaucoup moins avec les requêtes réelles.

Voici les deux requêtes complètes, structurées exactement de la même manière avec les mêmes types de données. Lancées séparément, elles font chacune la somme des heures (NBHE), une pour les VAC, l’autre pour les MIS. Ce que je cherche c’est à les unir en une seule afin de totaliser les NBHE (comme il se doit par année, par mois et par SAL).

Merci.

SELECT
YEAR(VAC_DATE_DEB) AS VAC_ANNEE,
MONTH(VAC_DATE_DEB) AS VAC_MOIS,
T_SAL.SAL_ID,
T_PER.PER_NOM_1,
T_PER.PER_PRENOM,
SUM(T_VAC_SUB.VAC_NBHE) AS VAC_NBHE
FROM
T_VAC_SUB,
T_VAC,
TJ_BEN_SAL,
T_SAL,
T_PER
WHERE T_VAC_SUB.VAC_ID = T_VAC.VAC_ID
AND T_VAC.JBS_ID = TJ_BEN_SAL.JBS_ID
AND TJ_BEN_SAL.SAL_ID = T_SAL.SAL_ID
AND T_SAL.SAL_ID = T_PER.PER_ID
AND T_VAC.VAC_STATUT = 1
GROUP BY
T_SAL.SAL_ID,
T_PER.PER_NOM_1,
T_PER.PER_PRENOM,
YEAR(VAC_DATE_DEB),
MONTH(VAC_DATE_DEB)

SELECT
YEAR(MIS_DATE_DEB) AS MIS_ANNEE,
MONTH(MIS_DATE_DEB) AS MIS_MOIS,
T_SAL.SAL_ID,
T_PER.PER_NOM_1,
T_PER.PER_PRENOM,
SUM(T_MIS_SUB.MIS_NBHE) AS MIS_NBHE
FROM
T_MIS_SUB,
T_MIS,
TJ_MUT_SAL,
T_SAL,
T_PER
WHERE T_MIS_SUB.MIS_ID = T_MIS.MIS_ID
AND TJ_MUT_SAL.JMS_ID = TJ_MUT_SAL.JMS_ID
AND TJ_MUT_SAL.SAL_ID = T_SAL.SAL_ID
AND T_SAL.SAL_ID = T_PER.PER_ID
AND T_MIS.MIS_STATUT = 1
GROUP BY
T_SAL.SAL_ID,
T_PER.PER_NOM_1,
T_PER.PER_PRENOM,
YEAR(MIS_DATE_DEB),
MONTH(MIS_DATE_DEB)

Je ne sais pas si une vue aurait résolu l’affaire. Mais par tâtonnements, j’ai fini par y parvenir.

SELECT PRE_ANNEE AS PRE_ANNEE, PRE_MOIS AS PRE_MOIS, SAL_ID AS SAL_ID, PER_NOM_1 AS PER_NOM_1, PER_PRENOM AS PER_PRENOM, SUM(PRE_NBHE) AS PRE_NBHE
FROM
	(
		SELECT YEAR(VAC_DATE_DEB) AS PRE_ANNEE, MONTH(VAC_DATE_DEB) AS PRE_MOIS, T_SAL.SAL_ID, T_PER.PER_NOM_1, T_PER.PER_PRENOM, SUM(T_VAC_SUB.VAC_NBHE) AS PRE_NBHE
		FROM T_VAC_SUB, T_VAC, TJ_BEN_SAL, T_SAL, T_PER
		WHERE T_VAC_SUB.VAC_ID = T_VAC.VAC_ID
		AND T_VAC.JBS_ID = TJ_BEN_SAL.JBS_ID
		AND TJ_BEN_SAL.SAL_ID = T_SAL.SAL_ID
		AND T_SAL.SAL_ID = T_PER.PER_ID
		AND T_VAC.VAC_STATUT = 1
		GROUP BY T_SAL.SAL_ID, T_PER.PER_NOM_1, T_PER.PER_PRENOM, YEAR(VAC_DATE_DEB), MONTH(VAC_DATE_DEB)

		UNION

		SELECT YEAR(MIS_DATE_DEB) AS PRE_ANNEE, MONTH(MIS_DATE_DEB) AS PRE_MOIS, T_SAL.SAL_ID, T_PER.PER_NOM_1, T_PER.PER_PRENOM, SUM(T_MISS_SUB.MIS_NBHE) AS PRE_NBHE
		FROM T_MISS_SUB, T_MISS, TJ_MUT_SAL, T_SAL, T_PER
		WHERE T_MISS_SUB.MIS_ID = T_MISS.MIS_ID
		AND T_MISS.JMS_ID = TJ_MUT_SAL.JMS_ID
		AND TJ_MUT_SAL.SAL_ID = T_SAL.SAL_ID
		AND T_SAL.SAL_ID = T_PER.PER_ID
		AND T_MISS.MIS_STATUT = 1
		GROUP BY T_SAL.SAL_ID, T_PER.PER_NOM_1, T_PER.PER_PRENOM, YEAR(MIS_DATE_DEB), MONTH(MIS_DATE_DEB)
	)
GROUP BY PRE_ANNEE, PRE_MOIS, SAL_ID, PER_NOM_1, PER_PRENOM

Comparaisons faites avec les deux requêtes séparées, j’obtiens bien les valeurs cumulées.

en tout cas simplifié (= factorisé)

!!!?? :thinking:

:wink:

Pour ton questionnement, c’est vrai que les AS étaient inutiles, sauf pour la somme.

Je l’ai également posée avec des jointures, j’obtiens le même résultat, mais j’ai du mal à me souvenir quelle méthode est préférable (faudrait que je me replonge dans le gros dossier SGBDR de Frédéric Brouard). :slightly_smiling_face: