2013-08-26 38 views
7

Điều này làm tôi thất vọng! Got dữ liệu sau:MySQL MAX từ 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 {chỉnh sửa 0001} :: có trường bổ sung, trong đó cũng phải được sử dụng để lọc dữ liệu, gọi nó là {TYPE}, một có thể nhận được 'SINGLE' hoặc ' MULTIPLE 'làm giá trị.

Tôi muốn nhận được MAX giữa SUM (của mỗi {REG} khác nhau) cho mỗi {ID}. Rõ ràng, đây là một biểu diễn đơn giản, bảng đã lên đến 64985928 sổ đăng ký và {DATE} là dữ liệu lọc.

Đó sẽ là, bước 1 lấy SUM cho mỗi {REG}:

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

Đó là:

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

Và sau đó, nhận được MAX từ mỗi SUM, đó là nơi tôi m stucked:

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

tôi đã thử:

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

Bất kỳ ý tưởng nào? PS: Xin lỗi vì lỗi.

PS {edit 0002} Sao chép các truy vấn và dữ liệu gốc, vì vậy nó có thể giúp tốt hơn.

$ 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 | 
+---------+-------------+ 

Sau đó, những gì tôi đang tìm kiếm là:

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

Nhưng chạy:

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; 

Kết quả như sau:

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

bạn đã đọc về 'have' ?? – 7alhashmi

+0

xem xét việc cung cấp sqlfiddle – Strawberry

Trả lời

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

Nếu tôi chạy truy vấn này, có vẻ như mọi phép tính đơn đều sai. – Wolfchamane

+0

Bạn có thể tường thuật tính toán sai, cung cấp dữ liệu mẫu hay không. –

+0

Ví dụ @ bài gốc – Wolfchamane

0

Bạn có thể thêm [Để bởi SUM (giá trị) DESC hạn 1] để nhận được giá trị tối đa của kết quả truy vấn.

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; 
Các vấn đề liên quan