2013-08-26 15 views
7

Questo mi fa impazzire! Got i seguenti dati:MySQL MAX da SUM

+----+-----+-------+------------+ 
| ID | REG | VALUE | DATE  | 
+----+-----+-------+------------+ 
| 1 | 1A | 100 | 2009-01-01 | 
| 1 | 1A | 100 | 2009-02-01 | 
| 1 | 1A | 100 | 2009-03-01 | 
| 2 | 1B | 100 | 2009-01-01 | 
| 2 | 1B | 100 | 2009-02-01 | 
| 2 | 1B | 100 | 2009-03-01 | 
| 2 | 1C | 100 | 2009-01-01 | 
| 2 | 1C | 100 | 2009-02-01 | 
| 2 | 1C | 200 | 2009-03-01 | 
+----+-----+-------+------------+ 

PS {Edit 0001} :: c'è un campo aggiuntivo, che pure devono essere utilizzati per filtrare i dati, lo chiamano {TYPE}, una potrebbe ottenere 'single' o ' MULTIPLO 'come valore.

Voglio ottenere il MAX tra SUM (di ogni diverso {REG}) per ogni {ID}. Ovviamente, questa è una semplice rappresentazione, la tabella ha ottenuto fino a 64985928 registri e {DATE} sono i dati di filtraggio.

Che sarà, primo passo ottenere la somma per ogni {REG}:

+----+------+ 
| ID | SUM | 
+----+------+ 
| 1 | 300 | 
| 2 | 300 | 
| 2 | 400 | 
+----+------+ 

Ecco:

SELECT 
    SUM(value) 
FROM 
    table 
WHERE 
    (date BETWEEN '2009-01-01' AND '2009-03-01') 
GROUP BY 
    reg; 

E poi, ottenere il MAX da ogni SUM, che è dove ho' m stucked:

+----+------+ 
| ID | MAX | 
+----+------+ 
| 1 | 300 | 
| 2 | 400 | 
+----+------+ 

ho provato:

SELECT 
    a.id, 
    MAX(b.sum) 
FROM 
    table a, 
    (SELECT 
    SUM(b.value) 
    FROM 
    table b 
    WHERE 
    (b.date BETWEEN '2009-01-01' AND '2009-03-01') AND (a.id = b.id) 
    GROUP BY 
    b.reg); 

Qualche idea? PS: Ci scusiamo per gli errori.

PS {edit 0002} Gonna copia query e dati originali, quindi può aiutare meglio.

$ query:

SELECT 
    clienteid AS "CLIENTE", 
    SUM(saldo) AS "SUMA" 
FROM 
    etl.creditos 
WHERE 
    (titularidad_tipo LIKE 'TITULAR') 
AND 
    (mes_datos BETWEEN '2008-11-01' AND '2009-10-01') 
GROUP BY 
    nuc 
ORDER BY 
    clienteid; 

Got:

+---------+-------------+ 
| CLIENTE | SUMA  | 
+---------+-------------+ 
| 64  | 1380690.74 | 
| 187  | 1828468.71 | 
| 187  | 2828102.80 | 
| 325  | 26037422.21 | 
| 389  | 875519.05 | 
| 495  | 20084.93 | 
| 495  | 109850.46 | 
+---------+-------------+ 

Poi, quello che sto cercando è:

+---------+-------------+ 
| CLIENTE | MAX   | 
+---------+-------------+ 
| 64  | 1380690.74 | 
| 187  | 1828468.71 | 
| 325  | 26037422.21 | 
| 389  | 875519.05 | 
| 495  | 109850.46 | 
+---------+-------------+ 

Ma esecuzione:

SELECT 
    clienteid AS "CLIENTE", 
    MAX(suma) 
FROM 
    (SELECT clienteid, SUM(saldo) AS "suma" FROM etl.creditos 
    WHERE (mes_datos BETWEEN '2009-08-01' AND '2009-10-01') AND (titularidad_tipo LIKE 'TITULAR') 
    GROUP BY clienteid, nuc) AS sums 
GROUP BY 
    clienteid 
ORDER BY 
    clienteid; 

i risultati come:

+---------+-------------+ 
| CLIENTE | SUMA  | 
+---------+-------------+ 
| 64  | 336879.21 | 
| 187  | 1232824.51 | 
| 325  | 3816173.62 | 
| 389  | 218423.83 | 
| 495  | 34105.99 | 
+---------+-------------+ 
+0

hai letto di 'aver' ?? – 7alhashmi

+0

considera la possibilità di fornire un numero di serie – Strawberry

risposta

9
SELECT ID, MAX(reg_sum) 
FROM 
(
    SELECT ID, SUM(value) AS reg_sum FROM table 
    WHERE (date BETWEEN '2009-01-01' AND '2009-03-01') 
    GROUP BY ID, reg 
) a GROUP by ID 
+0

Se eseguo questa query, sembra che ogni singolo calcolo sia errato. – Wolfchamane

+0

Puoi raccontare quale calcolo è sbagliato, fornire dati di esempio. –

+0

Esempi @ post originale – Wolfchamane

0

È possibile aggiungere [order by SUM (valore) limite DESC 1] per ottenere il valore massimo dei risultati della query.

SELECT SUM(value) as maxcount FROM table WHERE (date BETWEEN '2009 01-01' AND '2009-03-01') GROUP BY reg order by maxcount desc limit 1;