2016-09-24 2 views
1

다음 구조의 테이블이 있습니다.Cant는 자체 조인 쿼리를 계산합니다.

+-----------------------+--------------+------+-----+---------+-------+ 
| Field     | Type   | Null | Key | Default | Extra | 
+-----------------------+--------------+------+-----+---------+-------+ 
| linq_order_num  | char(32)  | NO | PRI | NULL |  | 
| order_status_id  | int(11)  | YES | MUL | NULL |  | 
| order_id    | varchar(100) | YES |  | NULL |  | 
| item_name    | varchar(120) | YES |  | NULL |  | 
| item_cost    | float  | YES |  | NULL |  | 
| custmer_id   | int(11)  | YES | MUL | NULL |  | 
| order_date_time  | datetime  | YES |  | NULL |  | 
| order_category  | varchar(120) | YES |  | NULL |  | 
| ordered_by   | int(11)  | YES | MUL | NULL |  | 
| linq_shipping_cost | float  | YES |  | NULL |  | 
| website_shipping_cost | float  | YES |  | NULL |  | 
| total_cost   | float  | YES |  | NULL |  | 
| advance_amount  | float  | YES |  | NULL |  | 
| website    | varchar(120) | YES |  | NULL |  | 
| other     | varchar(120) | YES |  | NULL |  | 
| rvn     | int(11)  | YES |  | NULL |  | 
| received_date   | datetime  | YES |  | NULL |  | 
| delivered_date  | datetime  | YES |  | NULL |  | 
| store_id    | int(11)  | YES | MUL | NULL |  | 
+-----------------------+--------------+------+-----+---------+-------+ 

그래서 매일 전체 주문 비용을 알아야합니다.이 쿼리를 사용하여 얻을 수 있습니다.

select sum(total_cost), date_format(order_date_time,"%Y-%m-%d") from 
     order_item group by date_format(order_date_time,"%Y-%m-%d") 

또한 배달 된 날짜의 총 잔액이 필요합니다.

select sum(total_cost-advance_amount),date_format(delivered_date,"%Y-%m-%d") 
     from order_item group by date_format(delivered_date,"%Y-%m-%d") 

모든 일, 주문이 발생하지 않습니다 및 모든 일 배달은 하루 더 주문 그날의 총 비용은 0으로 표시되어야하며, 총 잔량이해야 표시로 존재 happen.If합니다 그날의 (total_cost-advance_amount)의 합계.

하나의 쿼리에서 위의 두 쿼리를 결합하여 결과를 얻을 수있는 방법이 있습니까? 그래서

는 특정 일의 일 동안 요약 : 내가 합계 (총 비용)가 필요 ordered_date_time는 D를 = 여기서, 을 내가 합 필요 (총 비용 -advance_amount) delivered_date = D 은 본질적으로 같은 테이블을 찾고 여기서

Date   Total Cost   Total Delivery Amounts 
d     500      2000 
d1    0      900 
d2    900      0 

하위 쿼리를 사용해 보았습니다. 문제는이 D1의 경우 표시되지 않습니다이며, 여기서 그 날에 대한 총 비용은 0입니다

검색어 :

select 
    date_format(order_date_time,"%Y-%m-%d") date, 
    sum(total_cost) total, 
    sum(advance_amount) advance_amount, 
    IFNULL((select sum(total_cost-advance_amount) 
from order_item a 
where date_format(a.delivered_date,"%Y-%m-%d") = date_format(d.order_date_time,"%Y-%m-%d")),0) delivery_amount 
from order_item d 
group by date_format(order_date_time,"%Y-%m-%d"), delivery_amount 
+2

미래에는 테이블 스키마에'describe'를 사용하지 마십시오. 'show create table order_item'을 사용하십시오. 누군가가 사용하는 것은 사실상 쓸모가 없다고 설명합니다. – Drew

답변

1

당신은 파생 테이블로 두 개의 쿼리를 사용하여 날짜를 가입 할 수 있습니다 . 문제는 MySQL이 지원하지 않는 FULL OUTER JOIN이 필요하다는 것입니다. 그래서 먼저 쿼리

나는 또한 date(..)date_format(..)을 대체
select 
    dates.dt, 
    coalesce(tc.total_cost, 0), 
    coalesce(tm.total_remaining, 0) 
from (
    select date(order_date_time) as dt from order_item 
    union 
    select date(delivered_date) as dt from order_item 
) dates 
left join (
    select sum(total_cost) as total_cost, date(order_date_time) as dt 
    from order_item 
    group by dt 
) tc using(dt) 
left join (
    select sum(total_cost-advance_amount) as total_remaining, date(delivered_date) 
    from order_item 
    group by dt 
) tm using(dt) 

select date(order_date_time) as d from order_item 
union 
select date(delivered_date) as d from order_item 

싶게 조인 왼쪽을 사용하여 두 열에서 모든 날짜를 추출 할 필요가있다. 외부 선택 또는 응용 프로그램에서 날짜 서식을 지정할 수 있습니다.