2013-08-26 12 views
7

これは私をびっくりさせます!SUMからのMySQL MAX

+----+-----+-------+------------+ 
| 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 {編集0001} ::また、フィルタデータを使用する必要があり、余分なフィールドは、 '、「SINGLE」を得ることができ、それ{TYPE}を呼び出すかあります: には、以下のデータを手に入れました値として「マルチプル」。

各{ID}ごとに(各異なる{REG}の)SUMの間にMAXを取得したいと考えています。明らかに、これは単純な表現であり、テーブルは64985928個のレジスタに達し、{DATE}はフィルタリングデータです。なります

、第一ステップは、各{REG}のSUMを得る:

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

です:その後、

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

そして、私は「どこである、各SUMからMAXを取得しますmはstucked:私が試した

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

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

PS:間違って申し訳ありません。

PS {編集0002}元のクエリとデータをコピーすることができますので、より効果的です。

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

ガット:次に

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

、私が探しては、次のとおりです。

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

しかし、実行している:

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; 

結果:

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

「お持ちですか? – 7alhashmi

+0

sqlfiddleを提供することを検討してください – Strawberry

答えて

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

このクエリを実行すると、1回の計算がすべて間違っているようです。 – Wolfchamane

+0

どのような計算が間違っているかを説明することができますか? –

+0

例@元の投稿 – Wolfchamane

0

は、クエリ結果の最大値を取得するには、[SUM(値)DESC制限1によって順序]を追加することができます。

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;