SQL?

2010-12-30 3 views
1

지난 6 개월 동안 가입 한 모든 고객을 나열하려면 SQL 쿼리가 필요합니다.SQL?

이것은 내 SQL입니다.

select 
    c.company_name, 
    c.phone1, 
    c.sprovince, 
    c.scountry, 
    sum(order_total_amount) as amt_sold, 
    max(o.order_date) as last_order_date, 
    customersince 
from 
     tbl_company c 
join 
     tbl_order o 
    on c.companyid = o.company_id 
where 
    c.companytype like 'Customer' 
and 
    (PERIOD_DIFF(c.customersince,curdate())<6) 
group by company_name 
order by amt_sold desc 

이제는 customersince 열에 null이 있으면 고객의 첫 번째 주문을 확인해야합니다. 지난 6 개월 동안 해당 사용자도 표시해야합니다.

order_date는 tbl_order 테이블에서 사용할 수 있습니다. 고객의 첫 번째 주문은 customer_id의 min (order_date) 그룹입니다.

어떻게하면됩니까?

+0

customersince = customersince가 null 인 최소 (order_date)로 설정하여 고객 테이블을 업데이트 할 수 있습니까? 그렇게하면 쿼리를 단순화 (그리고 속도를 크게 향상) 할 수 있으며 데이터베이스가 커지기 시작하면 더 빠를 것입니다. – Matt

+0

@Matt 내가 할 수있는 권한이 .. .. ( – rgksugan

+0

의도적으로'GROUP BY company_name'입니까? 같은 이름 (다른'companyId')을 가진 두 개의 다른 회사가있는 경우 주문을 합산해야합니다 ? – Quassnoi

답변

1
SELECT c.company_name, 
     c.phone1, 
     c.sprovince, 
     c.scountry, 
     SUM(order_total_amount) as amt_sold, 
     MAX(o.order_date) as last_order_date, 
     COALESCE(customersince, MIN(o.order_date)) AS customersince 
FROM tbl_order o 
JOIN tbl_company c 
ON  c.companyid = o.company_id 
WHERE c.companytype like 'Customer' 
     AND (c.customersince >= NOW() - INTERVAL 6 MONTH OR c.customersince IS NULL) 
GROUP BY 
     companyid 
HAVING customersince >= NOW() - INTERVAL 6 MONTH 
ORDER BY 
     amt_sold DESC 

customersince에 두 번 조건 다음 WHERE 절에 하나의 HAVING 절에 또 하나.

tbl_customer (customersince)에 색인이있는 경우이 색인은 적절한 레코드를 일찍 필터링하고 나중에 자세히 필터링하는 데 사용됩니다.

1
PERIOD_DIFF(ifnull(c.customersince, `first_order`),curdate())<6) 

테이블 스키마를 포함해야합니다. 첫 번째 주문은 어떤 테이블을 참조합니까?

+0

나는 첫 번째 주문이' tbl_order'. – Quassnoi

+0

first order는 customer_id에 의한 min (order_date) 그룹입니다 ... – rgksugan

0

나는 테스트하기 위해 MySQL은이 없지만 절은 당신을 위해 작동 할 수있는 곳 :

where c.companytype like 'customer' 
and ( 
    (PERIOD_DIFF(c.customersince, curdate())<6) 
    OR 
    (c.customersince is null AND (PERIOD_DIFF(o.order_date, curdate())<6) 
) 

을 또한, 당신은, 합계 (집계 함수에 최대 당신이하지 않는 일을 추가해야합니다 , etc.)를 그룹 by 절에 추가하십시오.

+0

'MySQL'은'SELECT'리스트에서 그룹화되지 않은 컬럼을 사용할 수 있습니다. – Quassnoi