2012-11-07 2 views
0

이 쿼리를 실행하면 COUNT 함수가 'check_if_new_customer'플래그로 필터링하지 않습니다. 나는이 기사에서 읽었습니다 : http://dev.mysql.com/tech-resources/articles/wizard/page4.html SUM은 어떤 경우에는 COUNT 대신에 더 정확한 결과를 얻기 위해 사용될 수 있지만, 시도 할 때 매우 다른 것을 얻습니다. 이는 숫자가 엄청나게 두 배로 늘어나는 것처럼 보입니다. 나는 그 시점에서 계산하는 대신 id 필드에있는 UUID를 합산하기 때문에 이것이 가능할 것이라고 생각합니다. 기존 고객 전체와 신규 고객을 모두 계산할 수있는 방법에 대한 제안은 무엇입니까?join mysql에서 id의 스마트 계산

SELECT 
    YEAR(so.date_entered), 
    so.technical_address_country, 
    so.technical_address_state, 
    COUNT(so.id) as all_sales, 
    COUNT(mf.id) as all_jobs, 
    SUM(so.total_value) as all_value, 
    COUNT(IF(so.check_if_new_customer=1,so.id,0)) as sales_order_new, 
    SUM(IF(so.check_if_new_customer = 1,so.total_value,0)) as total_value_new, 
    COUNT(IF(so.check_if_new_customer=1,mf.id,0)) as jobs_new, 
    COUNT(IF(so.check_if_new_customer=0,so.id,0)) as sales_order_existing, 
    SUM(IF(so.check_if_new_customer = 0,so.total_value,0)) as total_value_existing, 
    COUNT(IF(so.check_if_new_customer=0,mf.id,0)) as jobs_existing, 
    SUM(IF(so.check_if_new_customer=0,mf.id,0)) as jobs_existing_t 
FROM 
    sugarcrm2.so_order so 
LEFT JOIN 
    sugarcrm2.mf_job mf on so.id = mf.sales_order_id 
WHERE 
    so.date_entered > "2011-10-30" AND 
    so.technical_address_country IS NOT NULL AND 
    so.technical_address_state IS NOT NULL AND 
    so.deleted = 0 AND 
    so.has_been_promoted = 1 
GROUP BY 
    YEAR(so.date_entered), 
    so.technical_address_country, 
    so.technical_address_state 
ORDER BY 
    so.technical_address_country, so.technical_address_state 

답변

1

을 jobs_existing으로 당신이 그것을 통과해야합니다 중 하나 1 0으로 설정하면 모든 1이 원하는만큼 합계됩니다. 당신은 모든 새로운 일자리의 합을 원한다면 귀하의 예제에서, 당신이 이런 짓을 했을까 :

SUM을 (IF (so.check_if_new_customer = 1,1,0)) jobs_new로

또는 so.check_if_new_customer 항상 1 또는 0을 반환하는 경우에는 다른 방법이 작업을 수행 할 수 있습니다 : jobs_new

SUM (so.check_if_new_customer를)

1

COUNT() 지정된 경우 인수가 아닌 NULL되는 레코드의 수를 반환합니다. 이 경우 인수는 IF() 표현식 (true 인 경우 일부 열의 값으로 평가되고 false 인 경우 0으로 계산 됨)이므로 거의 모든 레코드는 테스트 조건과 상관없이 계산됩니다.

SUM()은 이름에서 알 수 있듯이 인수의 값을 합산합니다. 이 경우 테스트 조건이 참일 때마다 참조 된 열의 값을 합산합니다.

분명히 당신이 뭘했는지는 모르겠지만 질문이 정확히 무엇을 원하는지 모호합니다. 추측 해 보면 다음과 같은 것을 원할 수 있습니다 :

SUM(so.check_if_new_customer) 
0

조인 된 테이블의 id 필드가 null이 아닐 때마다 +1하고 싶습니다.

SUM ((so.check_if_new_customer = 0 AND mf.id null가 아닌 경우, 1,0)) 당신이 COUNT() 같은 SUM()를 사용하려면

관련 문제