복붙노트

[SQL] MySQL은 실행중인 총을 계산

SQL

MySQL은 실행중인 총을 계산

나는이 MySQL의 쿼리를 가지고 :

SELECT DAYOFYEAR(`date`)  AS d, COUNT(*) 
FROM  `orders` 
WHERE  `hasPaid` > 0
GROUP  BY d
ORDER  BY d

어떤이 같은 것을 반환

d  | COUNT(*) |
20 |  5       |
21 |  7       |
22 | 12       |
23 |  4       |

내가 정말하고 싶은 것은 누적 합계를 표시하는 말에 다른 열 수 있습니다 :

d  | COUNT(*) | ??? |
20 |  5       |   5 |
21 |  7       |  12 |
22 | 12       |  24 |
23 |  4       |  28 |

이게 가능해?

해결법

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

    1.아마도 당신과 방지 쿼리의 톤을 할 필요 데이터베이스를위한 간단한 해결책. 이 실행하는 하나 개의 쿼리는 단일 패스의 결과에 약간의 수학을한다.

    아마도 당신과 방지 쿼리의 톤을 할 필요 데이터베이스를위한 간단한 해결책. 이 실행하는 하나 개의 쿼리는 단일 패스의 결과에 약간의 수학을한다.

    SET @runtot:=0;
    SELECT
       q1.d,
       q1.c,
       (@runtot := @runtot + q1.c) AS rt
    FROM
       (SELECT
           DAYOFYEAR(`date`) AS d,
           COUNT(*) AS c
        FROM  `orders`
        WHERE  `hasPaid` > 0
        GROUP  BY d
        ORDER  BY d) AS q1
    

    이렇게하면 추가 RT (누계) 컬럼을 제공 할 것입니다. 상단에있는 SET 문을 놓치지 마십시오 먼저 실행 전체 변수를 초기화하거나 그냥 NULL 값의 열을 얻을 것이다.

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

    2.

    SELECT 
       DAYOFYEAR(O.`date`)  AS d, 
       COUNT(*),
       (select count(*) from `orders` 
           where  DAYOFYEAR(`date`) <= d and   `hasPaid` > 0)
    FROM  
      `orders` as O
    WHERE  
      O.`hasPaid` > 0
    GROUP  BY d
    ORDER  BY d
    

    이것은 (내가 MySQL을 테스트 할 필요가 없습니다)하지만, 그것은 당신에게 아이디어를 보여줍니다 일부 구문 튜닝이 필요합니다. 하위 쿼리는 그냥 가서 이미 외부 쿼리에 포함 된 모든 신선한를 추가 할 수 있으며,이 모든 행에 대해 그렇게한다.

    사용하는 방법에 대한이 질문에 봐 같은 달성하기 위해 섭니다.

    최대 있기 때문에 : 증가하는 데이터와 성능 저하에 대한 주소 우려. 366 년의 일, 나는 여러 년에 대한이 쿼리를 실행하지 않는 가정은, 서브 쿼리는 366 배까지 평가받을 것입니다. 날짜와 hasPaid 플래그에 대한 적절한 지표로, 당신은 괜찮을 것이다.

  3. ==============================

    3.MySQL의 8부터는 쿼리 이런 종류의 윈도우 함수를 사용하는 것입니다 :

    MySQL의 8부터는 쿼리 이런 종류의 윈도우 함수를 사용하는 것입니다 :

    SELECT dayofyear(`date`) AS d, count(*), sum(count(*)) OVER (ORDER BY dayofyear(`date`))
    FROM `orders`
    WHERE `hasPaid` > 0
    GROUP BY d
    ORDER BY d
    

    상기 질의에 집계 기능 수 (*)는 때문에 SQL에서 연산의 논리적 순서 가능하다 윈도우 함수의 합 (..) OVER (..)의 내부에 중첩 된 것이다. 그의 너무 혼란 경우, 당신은 쉽게 더 나은 구조 쿼리에 절을 파생 테이블 또는를 사용에 의존 할 수 있습니다 :

    WITH daily (d, c) AS (
      SELECT dayofyear(`date`) AS d, count(*)
      FROM `orders`
      WHERE `hasPaid` > 0
      GROUP BY d
    )
    SELECT d, c, sum(c) OVER (ORDER BY d)
    ORDER BY d
    
  4. ==============================

    4.나는이 모든 결과 행은 독립해야 불가능하다고 말할 것입니다. 이 값을 얻기를위한 프로그래밍 언어를 사용하여

    나는이 모든 결과 행은 독립해야 불가능하다고 말할 것입니다. 이 값을 얻기를위한 프로그래밍 언어를 사용하여

  5. ==============================

    5.당신이 다른 옵션이 없지만 SQL에서이 일을하지 않는 한, 나는 쿼리를 만드는 프로그래밍 언어에 결과를 요약 것입니다. 이 의지와 같은 중첩 테이블이 성장함에 따라 매우 느린되었다.

    당신이 다른 옵션이 없지만 SQL에서이 일을하지 않는 한, 나는 쿼리를 만드는 프로그래밍 언어에 결과를 요약 것입니다. 이 의지와 같은 중첩 테이블이 성장함에 따라 매우 느린되었다.

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

    6.당신은 십자가가 문을 가입하여이 해킹하거나 일부 slef 조인하지만 그렇게 아마 최고의 포스트 쿼리 프로세서에서 수행 어떤 큰 데이터 세트 느린 얻을 것이다; 두 클라이언트 코드에서의 커서

    당신은 십자가가 문을 가입하여이 해킹하거나 일부 slef 조인하지만 그렇게 아마 최고의 포스트 쿼리 프로세서에서 수행 어떤 큰 데이터 세트 느린 얻을 것이다; 두 클라이언트 코드에서의 커서

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

    7.성능이 나도 것 중요한 경우에, 커서가 빠르게 세트를 기반으로 쿼리보다 유일한 장소 중 하나입니다

    성능이 나도 것 중요한 경우에, 커서가 빠르게 세트를 기반으로 쿼리보다 유일한 장소 중 하나입니다

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

    8.MySQL의에서 임시 테이블을 사용하여 실행 균형을 계산하는 것이 가능하다. 다음 쿼리는 작동합니다 :

    MySQL의에서 임시 테이블을 사용하여 실행 균형을 계산하는 것이 가능하다. 다음 쿼리는 작동합니다 :

    CREATE TEMPORARY table orders_temp1 (SELECT id, DAYOFYEAR(`date`)  AS d, COUNT(*) as total FROM  `orders` WHERE  `hasPaid` > 0 GROUP BY d ORDER  BY d);
    CREATE TEMPORARY table orders_temp2 (SELECT * FROM orders_temp1);
    SELECT d, total, (SELECT SUM(t2.total) FROM orders_temp2 t2 WHERE t2.id<=t1.id) as running_total FROM orders_temp1 t1;
    

    임시 테이블은 쿼리를 구성하는 데 사용됩니다. 참고 임시 테이블은 MySQL 서버에 대한 연결이 지속되는 동안 존재

    위의 쿼리는 현재 행을 포함하여 최대 개까지 임시 테이블의 모든 행의 균형을 반환하는 서브 쿼리를 사용합니다. 저울은 실제 테이블에서 현재 행에 할당

  9. from https://stackoverflow.com/questions/664700/calculate-a-running-total-in-mysql by cc-by-sa and MIT license