2016-09-24 34 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(..)。您可以在外部选择或应用程序中格式化日期。