2012-07-06 3 views
12

Ho già letto (this), ma non sono riuscito a trovare un modo per implementarlo nel mio problema specifico. So che SUM() è una funzione aggregata e non ha senso non usarla come tale, ma in questo caso specifico, devo fare SUM() tutti i risultati mantenendo ogni singola riga.Utilizzo di SUM() senza raggruppare i risultati

Ecco la tabella:

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

ho bisogno di SUM() la quantità, ma continuo a ogni record, quindi l'uscita dovrebbe essere come:

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

ho avuto questa domanda, ma solo le somme ogni riga, non tutti i risultati insieme:

SELECT 
    a.id, 
    SUM(b.amount) 

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

senza il SUM() i t restituirebbe solo una riga singola, ma ho bisogno di mantenere tutti gli ID ...

Nota: Sì, questo è un esempio piuttosto semplice e potrei usare php per farlo qui, ma ovviamente il tavolo è più grande e ha più righe e colonne, ma non è questo il punto.

risposta

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

È necessario eseguire un cartesian join del valore della somma di ogni riga nella tabella per ogni id. Poiché esiste un solo risultato della sottoselezione (49), in pratica viene applicato a ogni id.

+0

Genius! Grazie per quello :) – Anonymous

5

unire la tabella originale per la somma con una sottoquery:

SELECT * FROM table1, (SELECT SUM(amount) FROM table1 AS amount) t 
+0

@Bohemian, guarda più da vicino, la subquery non è nella clausola 'select', ma è in realtà parte della clausola 'FROM' che crea un prodotto cartesiano. Esegue solo una volta. –

+0

@ZaneBien a destra - ho cancellato il mio commento – Bohemian

0

questo non solo sum() interrogazione, quindi dovrebbe eseguire OK:

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

con MS SQL è possibile utilizzare più()

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

--- OLTRE PARTITION ID
PARTITION BY che è molto utile quando si desidera eseguire SUM() per MONTH ad esempio o fare report trimestrali s o annuale ... (Nota esigenze distinte che sta facendo per tutte le righe)

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

+0

Devo essermi sbagliato, ma hai scritto seriamente ogni singolo valore dal database? Non è molto programmatico e quindi non molto utile. – Anonymous

+0

è un esempio, è possibile sostituire "FROM (...) con una query complessa. Il secondo esempio è con PARTITION BY che è molto utile quando si desidera eseguire SUM() per MONTH ad esempio –