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.
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
.
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
--- 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
Joignez la table d'origine à la somme avec une sous-requête:
SELECT * FROM table1, (SELECT SUM(amount) FROM table1 AS amount) t
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