私はこのテーブルを持っていると仮定します
_id | cash
1 200
2 301
3 101
4 700
_
そして、前のすべての現金の合計が特定の値より大きい最初の行を返したい:
したがって、たとえば、前のすべての現金の合計が500を超える最初の行を返す場合、3行目に戻ります
Mysqlステートメントを使用してこれを行うにはどうすればよいですか?
WHERE SUM(cash) > 500
を使用しても機能しません
HAVING句での比較にのみ集計を使用できます。
GROUP BY ...
HAVING SUM(cash) > 500
HAVING
句では、GROUP BY句を定義する必要があります。
前のすべての現金の合計が特定の値より大きい最初の行を取得するには、次を使用します。
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句で参照できます。
テストされていませんが、これは近いと思いますか?
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つスキップして次の行を返すという考え方です。
一般に、SQLクエリのWHERE
句の条件は、単一の行のみを参照できます。 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 |
+----+----------+
集計関数を使用してフィルタリングする場合、HAVINGステートメントを使用する必要があります。
SELECT *
FROM tblMoney
HAVING Sum(CASH) > 500