web-dev-qa-db-fra.com

Comment ajouter les résultats de deux commandes de sélection dans une même requête

J'ai actuellement deux commandes de sélection comme ci-dessous. Ce que je voudrais faire, c'est additionner les résultats dans la requête SQL plutôt que les variables dans le code.

select sum(hours) from resource;
select sum(hours) from projects-time;

Est-il possible d'avoir les deux dans le même code SQL et de générer une somme des deux résultats?

24
Rhys

Oui. C'est possible :D

SELECT  SUM(totalHours) totalHours
FROM
        ( 
            select sum(hours) totalHours from resource
            UNION ALL
            select sum(hours) totalHours from projects-time
        ) s

En tant que note de bas de page, le nom de table projects-time doit être délimité pour éviter les erreurs de syntaxe. Les symboles de délimiteur varient selon le SGBDR que vous utilisez.

51
John Woo

Une solution simple comme celle-ci peut être réalisée à l'aide de sous-requêtes dans la clause select:

select ((select sum(hours) from resource) +
        (select sum(hours) from projects-time)
       ) as totalHours

Pour une requête aussi simple, une telle sous-sélection est raisonnable.

Dans certaines bases de données, vous devrez peut-être ajouter from dual pour que la requête soit compilée.

Si vous souhaitez afficher chacun individuellement:

select (select sum(hours) from resource) as ResourceHours,
       (select sum(hours) from projects-time) as ProjectHours

Si vous voulez les deux et la somme, une sous-requête est pratique:

select ResourceHours, ProjectHours, (ResourceHours+ProjecctHours) as TotalHours
from (select (select sum(hours) from resource) as ResourceHours,
             (select sum(hours) from projects-time) as ProjectHours
     ) t
25
Gordon Linoff

UNION ALL une fois, agrégé une fois:

SELECT sum(hours) AS total_hours
FROM   (
   SELECT hours FROM resource
   UNION ALL
   SELECT hours FROM "projects-time" -- illegal name without quotes in most RDBMS
   ) x
10

Répétez l'opération pour plusieurs agrégations telles que SELECT sum (AMOUNT) AS TOTAL_AMOUNT FROM ( SELECT AMOUNT FROM table_1 UNION ALL SELECT AMOUNT FROM table_2 UNION ALL SELECT ASSURED_SUM DE table_3 ....)

0
Pratik Roy