2017-11-15 3 views
0

조건을 충족하는 모든 열의 총합을 얻으려고합니다. 여기 내 현재 설정이 내가 지금 무엇을 가지고WHERE 조건에서 mysql SUM 열

SELECT 
         COUNT(order_type = 'BUY') AS buy_fill, 
         COUNT(order_type = 'SELL') AS sell_fill, 
         SUM(btc_total) AS fill_sum 
         FROM fill_orders 
         WHERE coin_id = '$coin' 
         AND time_stamp >= DATE_SUB(NOW(), INTERVAL 55 SECOND) 

이고 그것의 계산은 내가 가지고도 나에게 모든 주문의 합계를주고 얼마나 많은 구매의 종류 및 판매 주문 그러나 나는 휴식에의 합이 필요합니다 주문을 구매 주문 및 판매 주문.

내가 작업하려고하는 코드에 Heres. 내가 추가 한 (btc_total WHERE ORDER_TYPE = 'BUY') 및 SUM (btc_total WHERE ORDER_TYPE = 'SELL')

 SELECT 
          COUNT(order_type = 'BUY') AS buy_fill, 
          COUNT(order_type = 'SELL') AS sell_fill, 
          SUM(btc_total) AS fill_sum, 

          SUM(btc_total WHERE order_type = 'BUY') AS buy_total 
          SUM(btc_total WHERE order_type = 'SELL') AS sell_total 
         FROM fill_orders 
         WHERE coin_id = '$coin' 
         AND time_stamp >= DATE_SUB(NOW(), INTERVAL 55 SECOND) 
+0

'GROUP BY order_type'? 새로운 것을 쓰지 말고 원래 문장에 추가하십시오. – Mako212

+0

이렇게하면 두 줄의'COUNT' 줄을'COUNT (order_type) fill '한 줄로 접을 수 있습니다. – Mako212

+0

글쎄요. 그 데이터. 필자는 쿼리를 확장하고 fill_sum을 중단하여 BUY 및 SELL totals로 채우기 만하면됩니다. 이제 fill_sum은 둘의 조합입니다. – user3369825

답변

1

"조건부 집계는"통상적으로 포함 case expression

SELECT 
     COUNT(CASE WHEN order_type = 'BUY' THEN order_type END)  AS buy_fill 
    , COUNT(CASE WHEN order_type = 'SELL' THEN order_type END)  AS sell_fill 
    , SUM(btc_total)            AS fill_sum 
    , SUM(CASE WHEN order_type = 'BUY' THEN btc_total ELSE 0 END) AS buy_total 
    , SUM(CASE WHEN order_type = 'SELL' THEN btc_total ELSE 0 END) AS sell_total 
FROM fill_orders 
WHERE coin_id = '$coin' 
AND time_stamp >= DATE_SUB(NOW(), INTERVAL 55 SECOND) 
+0

이것은 완벽하게 작동했습니다! 감사! – user3369825

1

변경이이에

SUM(btc_total WHERE order_type = 'BUY') AS buy_total 

:

SUM(IF(order_type='BUY',btc_total,NULL)) AS buy_total 

MySQL IF() 함수는 첫 번째 인수를 부울로 평가하고, TRUE이면 두 번째 인수를 반환하고 그렇지 않으면 세 번째 인수를 반환합니다.

각 행에 대해 평가되고 해당 표현식의 반환 값은 SUM() 집계에 의해 합산됩니다.

또는 동일한 결과를 달성하기 위해 더 ANSI 표준 당량을 사용

SUM(CASE WHEN order_type = 'BUY' THEN btc_total END) AS buy_total 

이 패턴은 일반적으로 "조건 집합 '이라고 칭한다. 은 "계산"를

우리는 다음과 같이 SUM으로 COUNT을 대체 할 수

SUM(order_type = 'BUY') AS buy_fill 

MySQL은 다음에 의해 합계됩니다 1, 0 또는 NULL을 반환하는 부울,으로 평등 비교 평가 SUM 집계. (. 그 카운트가 0과 1이 아니라 사람을 포함 할 것)

위는

SUM(CASE 
    WHEN order_type = 'BUY' THEN 1 
    WHEN order_type <> 'BUY' THEN 0 
    ELSE NULL 
    END 
    ) AS buy_fill 

에 해당 우리가 COUNT 집계를 사용하려는 경우, 우리는 다음과 같이 그것을 할 수 :

COUNT(IF(order_type = 'Buy',1,NULL)) AS buy_fill 

(우리는 1 대신에 null 이외의 값을 사용하고 동등한 결과를 얻을 수 있습니다.)

+0

이것은 또한 정답입니다. – user3369825