14

いずれかの列の値の合計が特定の値に達するまで、すべての行を返すクエリを作成したいと考えています。

たとえば、次の表を参照してください。

           DATE             ETC      Meeting
    2013-02-01 00:00:00    85482        1
    2013-02-01 00:00:00    47228        2
    2013-02-02 00:00:00    12026        4
    2013-02-03 00:00:00    78927        6
    2013-02-04 00:00:00    85662        2
    2013-03-05 00:00:00    47978        1
    2013-08-07 00:00:00     8582        1

列の合計が7になるまで行を取得したい場合Meeting

           DATE             ETC      Meeting
    2013-02-01 00:00:00    85482        1
    2013-02-01 00:00:00    47228        2
    2013-02-02 00:00:00    12026        4

Meeting列の合計が13になるまで行を取得したい場合。

     DATE                   ETC      Meeting
    2013-02-01 00:00:00    85482        1
    2013-02-01 00:00:00    47228        2
    2013-02-02 00:00:00    12026        4
    2013-02-03 00:00:00    78927        6
4

8 に答える 8

9

ストアドプロシージャなしでそれを行う方法は次のとおりです。

SET @msum := 0;
SELECT t1.* 
FROM (
    SELECT m.*,  
          (@msum := @msum + m.meetings) AS cumulative_meetings
    FROM meetings m 
    ORDER BY m.date ASC
) t1 
WHERE t1.cumulative_meetings <= 7;
于 2013-02-15T09:14:36.187 に答える
8

MySQL で動作するはずの方法は次のとおりです。

SELECT
  O.Id,
  O.Type,
  O.MyAmountCol,
  (SELECT
     sum(MyAmountCol) FROM Table1
   WHERE Id <= O.Id) 'RunningTotal'
FROM Table1 O
HAVING RunningTotal <= 7

これには、現在の合計を計算し、現在の合計が指定された数以下である間にレコードを選択することが含まれます (この場合は ) 7

SQL フィドル

于 2013-02-15T09:01:52.593 に答える
5

これはすべてを凌駕します。

SET @runningTotal=0;
SELECT
  O.Id,
  O.Type,
  O.MyAmountCol,
  @runningTotal + O.MyAmountCol as 'RunningTotal',
  @runningTotal := @runningTotal + O.MyAmountCol
FROM Table1 O
HAVING RunningTotal <=7;

SQL フィドル

両方のクエリの実行計画を見てください。

于 2016-03-26T10:04:01.243 に答える
1

使用するRDBMSについては述べないでください。これは、問題を解決するために使用できるt-sqlのスクリプトです。

DECLARE @numberToReach INT;
SET @numberToReach = 10; --you can change this

DECLARE @date DATETIME;
DECLARE @etc VARCHAR(20);
DECLARE @meeting INT;
DECLARE @temp_sum INT;

CREATE TABLE #tempTable
    (
        Dates DATETIME,
        Etcs VARCHAR(20),
        Meeting INT,
    )

DECLARE tempcursor CURSOR FOR
        SELECT *
        FROM YourTABLENAME
OPEN tempcursor;
FETCH NEXT FROM tempcursor INTO @date, @etc, @meeting;

WHILE(@@FETCH_STATUS = 0)
BEGIN
    SET @temp_sum = @temp_sum + @meeting;
    IF @temp_sum < @numberToReach 
    BEGIN
        INSERT INTO #tempTable
        (
            Dates,
            Etcs,
            Meeting
        )
        VALUES
        (
            @date, 
            @etc, 
            @meeting
        )

        FETCH NEXT FROM tempcursor INTO @date, @etc, @meeting;
    END 
END

SELECT * FROM #tempTable

CLOSE tempcursor
DEALLOCATE tempcursor

DROP TABLE  #tempTable
于 2013-02-15T08:31:43.350 に答える
1

DBMS が指定されていないため、以下はさまざまな DBMS で機能する ANSI SQL ソリューションです。

select *
from (
    select date_column, 
           etc, 
           sum(Meeting) over (order by date_column asc) run_sum
    from meetings
) t
where run_sum <= 7
order by date_column asc;

( SQL の予約語であり、問​​題を回避するために列名として使用すべきではないため、date_column代わりに列名を使用しました)dateDATE

于 2013-02-15T10:50:35.480 に答える
0

Oracle では、SUM 分析関数を使用できると思います。ここで参照できます: http://www.adp-gmbh.ch/ora/sql/analytical/sum.html

于 2013-02-15T08:51:20.910 に答える
0

これは醜い方法です:

SELECT *
FROM meetings m1
WHERE (SELECT SUM(m2.Meeting) 
       FROM meetings m2 
       WHERE m2.DATE < m1.DATE OR (m2.DATE = m1.DATE AND m2.ETC >= m1.ETC)) <= 7

順序付けは最初に基づいておりDATE、次にETC降順になっています。それが一意でない場合、間違った結果が得られることに注意してください。

于 2013-02-15T08:14:46.453 に答える
-1

SQL Server を使用している場合は、CROSS APPLYを使用します。

于 2013-02-15T08:18:03.157 に答える