web-dev-qa-db-fra.com

Utilisation de SUM () sans regrouper les résultats

J'ai déjà lu (this) , mais je n'ai pas pu trouver un moyen de l'implémenter à mon problème spécifique. Je sais que SUM() est une fonction agrégée et cela n'a pas de sens de ne pas l'utiliser en tant que telle, mais dans ce cas spécifique, je dois SUM() tous les résultats tout en conservant chaque une seule rangée.

Voici le tableau:

--ID-- --amount--
  1        23
  2        11
  3        8
  4        7

J'ai besoin de SUM() le montant, mais conservez chaque enregistrement, donc la sortie devrait être comme:

--ID-- --amount--
  1        49
  2        49
  3        49
  4        49

J'ai eu cette requête, mais elle résume uniquement chaque ligne, pas tous les résultats ensemble:

SELECT 
    a.id,
    SUM(b.amount)

FROM table1 as a 
JOIN table1 as b ON a.id = b.id
GROUP BY id

Sans la SUM(), elle ne retournerait qu'une seule ligne, mais je dois conserver tous les ID ...

Remarque: Oui, c'est un exemple assez basique et je pourrais utiliser php pour le faire ici, mais évidemment le tableau est plus grand et a plus de lignes et de colonnes, mais ce n'est pas le point.

18
Anonymous
SELECT a.id, b.amount
FROM table1 a
CROSS JOIN
(
    SELECT SUM(amount) amount FROM table1
) b

Vous devez effectuer une jointure cartésienne de la valeur de la somme de chaque ligne du tableau pour chaque id. Puisqu'il n'y a qu'un seul résultat de la sous-sélection (49), il est simplement cloué sur chaque id.

13
Zane Bien

avec MS SQL, vous pouvez utiliser OVER ()

 select id, SUM(amount) OVER()
 from table1



select id, SUM(amount) OVER()
from (
  select 1 as id, 23 as amount
  union all
  select 2 as id, 11 as amount
  union all
  select 3 as id, 8 as amount
  union all
  select 4 as id, 7 as amount
) A

enter image description here

--- ID DE PARTITION SUPPLÉMENTAIRE
PARTITION BY qui est très utile lorsque vous voulez faire SUM () par MOIS par exemple ou faire des rapports trimestriels sur les ventes ou annuellement ... (La note doit être distincte pour toutes les lignes)

 select distinct id, SUM(amount) OVER(PARTITION BY id) as [SUM_forPARTITION]
 from (
     select 1 as id, 23 as amount
     union all
     select 1 as id, 23 as amount
     union all
     select 2 as id, 11 as amount
     union all
     select 2 as id, 11 as amount
     union all
     select 3 as id, 8 as amount
     union all
     select 4 as id, 7 as amount
) OverPARTITIONID

enter image description here

9
Valentin Petkov

Joignez la table d'origine à la somme avec une sous-requête:

SELECT * FROM table1, (SELECT SUM(amount) FROM table1 AS amount) t
5
Jon

Cela ne fait qu'une seule requête sum(), donc elle devrait effectuer OK:

SELECT a.id, b.amount
FROM table1 a
cross join (SELECT SUM(amount) as amount FROM table1 AS amount) b
0
Bohemian