2013-08-26 11 views
7

To mnie przeraża! Mam następujące dane:MySQL MAX od 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 {edycji 0001} :: Nie ma dodatkowe pole, które musi być również używany do filtrowania danych, nazwać {type} mógł dostać „jeden” lub " MULTIPLE "jako wartość.

Chcę uzyskać MAX między SUMĄ (każdego innego {REG}) dla każdego {ID}. Oczywiście, jest to prosta reprezentacja, tabela ma do 64985928 rejestrów, a {DATA} to dane filtrowania.

To będzie, 1. etap uzyskać SUM dla każdego {REG}:

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

to:

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

a następnie uzyskać max od każdego Sum, czyli tam, gdzie ja” m stucked:

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

próbowałem:

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); 

Każdy pomysł? PS: Przepraszam za błędy.

PS {edit 0002} Zamierzam skopiować oryginalne zapytania i dane, więc może to pomóc lepiej.

$ zapytanie:

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; 

otrzymała:

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

Następnie, co szukam jest:

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

Ale działa:

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; 

wyników:

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

Czy przeczytałeś o "posiadaniu"? – 7alhashmi

+0

rozważ wprowadzenie sqlfiddle – Strawberry

Odpowiedz

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

Jeśli uruchomię to zapytanie, wydaje się, że każde obliczenie jest nieprawidłowe. – Wolfchamane

+0

Czy możesz opowiedzieć, jakie obliczenia są błędne, podać przykładowe dane. –

+0

Przykłady @ oryginalny post – Wolfchamane

0

można dodać [zamów przez suma (wartość) graniczne DESC 1], aby uzyskać maksymalną wartość z wyników kwerendy.

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;