복붙노트

[SQL] ㄱ 열 합을 행을 제한하는 MySQL은 소정의 값과 같다

SQL

ㄱ 열 합을 행을 제한하는 MySQL은 소정의 값과 같다

나는 열 값 중 하나의 합이 특정 값에 도달 할 때까지 모든 행을 반환하는 쿼리를 작성합니다.

아래 표에서 예를 들면 :

           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에 달할 때까지 행을 얻을합니다.

           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

나는 열 회의의 합이 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

해결법

  1. ==============================

    1.다음은 MySQL의에서 작동해야하는 방법이다 :

    다음은 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)에서, 소정 개수 이하인 상태에서 레코드를 선택하는 것을 포함한다.

  2. ==============================

    2.다음은 저장 프로 시저없이 그것을 할 수있는 방법이있다 :

    다음은 저장 프로 시저없이 그것을 할 수있는 방법이있다 :

    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;
    
  3. ==============================

    3.이 사람은 모든 것을 능가하는 성능.

    이 사람은 모든 것을 능가하는 성능.

    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 바이올린

    두 쿼리에 대한 실행 계획을 살펴보십시오.

  4. ==============================

    4.인 Hemant 당신은 RDBMS 사용하는 것을 명시하지 않습니다. 다음은 문제를 해결하기 위해 사용할 수있는 T-SQL의 스크립트입니다.

    인 Hemant 당신은 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
    
  5. ==============================

    5.여기 못생긴 방법이있다 :

    여기 못생긴 방법이있다 :

    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을 기반으로합니다. 즉 고유하지 않은 경우, 잘못된 결과를 얻을 수 있습니다.

  6. ==============================

    6.오라클, 나는 당신이 SUM 분석 기능을 사용할 수 있다고 생각합니다. 당신은 여기에서 참조 할 수 있습니다 : http://www.adp-gmbh.ch/ora/sql/analytical/sum.html

    오라클, 나는 당신이 SUM 분석 기능을 사용할 수 있다고 생각합니다. 당신은 여기에서 참조 할 수 있습니다 : http://www.adp-gmbh.ch/ora/sql/analytical/sum.html

  7. ==============================

    7.어떤 DBMS가 주어지지로, 다음은 DBMS의 넓은 범위에서 작동하는 ANSI SQL 솔루션입니다 :

    어떤 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;
    

    (DATE는 SQL 예약어이며 문제를 방지하기 위해 열 이름으로 사용해서는 안 때문에 대신 날짜의 열 이름 date_column을 사용)

  8. ==============================

    8.당신은 SQL Server를 사용하는 경우, CROSS APPLY가 사용합니다.

    당신은 SQL Server를 사용하는 경우, CROSS APPLY가 사용합니다.

  9. from https://stackoverflow.com/questions/14890486/limiting-the-rows-to-where-the-sum-a-column-equals-a-certain-value-in-mysql by cc-by-sa and MIT license