[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.다음은 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.다음은 저장 프로 시저없이 그것을 할 수있는 방법이있다 :
다음은 저장 프로 시저없이 그것을 할 수있는 방법이있다 :
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.이 사람은 모든 것을 능가하는 성능.
이 사람은 모든 것을 능가하는 성능.
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.인 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.여기 못생긴 방법이있다 :
여기 못생긴 방법이있다 :
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.오라클, 나는 당신이 SUM 분석 기능을 사용할 수 있다고 생각합니다. 당신은 여기에서 참조 할 수 있습니다 : http://www.adp-gmbh.ch/ora/sql/analytical/sum.html
오라클, 나는 당신이 SUM 분석 기능을 사용할 수 있다고 생각합니다. 당신은 여기에서 참조 할 수 있습니다 : http://www.adp-gmbh.ch/ora/sql/analytical/sum.html
-
==============================
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.당신은 SQL Server를 사용하는 경우, CROSS APPLY가 사용합니다.
당신은 SQL Server를 사용하는 경우, CROSS APPLY가 사용합니다.
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
'SQL' 카테고리의 다른 글
[SQL] SQL에서 대문자로 분할 단어 (0) | 2020.05.04 |
---|---|
[SQL] 어떻게 총칭 SQL Server 쿼리를 사용하여 정렬 할 수 있나요 A '버전 번호'열 (0) | 2020.05.04 |
[SQL] 지역 시퀀스는이 포함 제외한 쿼리 연산자의 SQL 구현 () 연산자에 LINQ에서 사용할 수 없습니다 (0) | 2020.05.04 |
[SQL] 데이터베이스 효율 - 사용자의 사용자 대 테이블 당 테이블 (0) | 2020.05.04 |
[SQL] 어떻게 Doctrine2에서 SQL의 YEAR (), MONTH () 및 DAY ()를 사용할 수 있습니까? (0) | 2020.05.04 |