2016-09-24 31 views
1

我有一個表格,其結構如下。無法找出自我加入查詢

+-----------------------+--------------+------+-----+---------+-------+ 
| 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") 

並非所有的日子,訂單會發生,而不是所有的日子交付將happen.If有一天,沒有訂單的那一天的總成本應顯示爲零,並顯示總剩餘量應該是(total_cost-advance_amount)的總和。

有沒有辦法將上述兩個查詢合併到一個查詢中並得到結果?

所以總結某一天d: 我需要的總和(TOTAL_COST)其中ordered_date_time = d, 我需要的總和(TOTAL_COST -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

你可以用你的兩個查詢,派生表,並加入他們的日期。問題是,你需要一個FULL OUTER JOIN,這是MySQL不支持的。所以,你首先需要從兩列

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

UND使用左連接提取所有的日期與您的查詢

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) 

我也date(..)更換date_format(..)。您可以在外部選擇或應用程序中格式化日期。