56

私がこのテーブルを持っているとしましょう

id | cash 
1    200
2    301
3    101
4    700

そして、前のすべての現金の合計が特定の値よりも大きい最初の行を返したいと思います。

したがって、たとえば、前のすべての現金の合計が500を超える最初の行を返したい場合は、行3に戻る必要があります。

mysqlステートメントを使用してこれを行うにはどうすればよいですか?

使用WHERE SUM(cash) > 500 しても機能しません

4

4 に答える 4

115

HAVING句での比較には、集計のみを使用できます。

GROUP BY ...
  HAVING SUM(cash) > 500

このHAVING句では、GROUPBY句を定義する必要があります。

以前のすべての現金の合計が特定の値よりも大きい最初の行を取得するには、次を使用します。

SELECT y.id, y.cash
  FROM (SELECT t.id,
               t.cash,
               (SELECT SUM(x.cash)
                  FROM TABLE x
                 WHERE x.id <= t.id) AS running_total
         FROM TABLE t
     ORDER BY t.id) y
 WHERE y.running_total > 500
ORDER BY y.id
   LIMIT 1

集計関数はサブクエリで発生するため、その列エイリアスはWHERE句で参照できます。

于 2010-07-19T19:41:32.507 に答える
7

テストされていませんが、これは近いと思いますか?

SELECT m1.id
FROM mytable m1
INNER JOIN mytable m2 ON m1.id < m2.id
GROUP BY m1.id
HAVING SUM(m1.cash) > 500
ORDER BY m1.id
LIMIT 1,2

アイデアは、前のすべての行を合計し、前の行の合計が500を超える行のみを取得してから、1つをスキップして、次の行を返すことです。

于 2010-07-19T19:51:46.647 に答える
5

一般に、WHERESQLクエリの句の条件は、単一の行のみを参照できます。句のコンテキストは、WHERE句によって順序が定義される前に評価されORDER BY、RDBMSテーブルへの暗黙的な順序はありません。

派生テーブルを使用して、各行をより小さな値の行のグループに結合しid、各合計グループの合計を生成できます。次に、合計が基準を満たしている場所をテストします。

CREATE TABLE MyTable ( id INT PRIMARY KEY, cash INT );

INSERT INTO MyTable (id, cash) VALUES
  (1, 200), (2, 301), (3, 101), (4, 700);

SELECT s.*
FROM (
  SELECT t.id, SUM(prev.cash) AS cash_sum
  FROM MyTable t JOIN MyTable prev ON (t.id > prev.id)
  GROUP BY t.id) AS s
WHERE s.cash_sum >= 500
ORDER BY s.id
LIMIT 1;

出力:

+----+----------+
| id | cash_sum |
+----+----------+
|  3 |      501 |
+----+----------+
于 2010-07-19T19:54:04.330 に答える
0

集計関数を使用してフィルタリングする場合は、HAVINGステートメントを使用する必要があります。

SELECT *
FROM tblMoney
HAVING Sum(CASH) > 500
于 2010-07-19T19:42:50.527 に答える