Mysql 无法计算自联接查询
我有一张结构如下的桌子Mysql 无法计算自联接查询,mysql,self-join,correlated-subquery,Mysql,Self Join,Correlated Subquery,我有一张结构如下的桌子 +-----------------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------------+--------------+------+-----+---------+-------+ | linq_order_num
+-----------------------+--------------+------+-----+---------+-------+
| 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")
并非所有日期都有订单,也并非所有日期都有交货。如果有一天没有订单,则该天的总成本应显示为零,显示的总剩余金额应为该天的(总成本预付金额)之和
有没有办法将上述两个查询合并到一个查询中并得到结果
因此,总结一下某一天的情况:
我需要总和(总成本),其中订单日期时间=d,
我需要总额(总成本-预付款金额),其中交货日期=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
您可以将两个查询用作派生表,并在日期将它们联接起来。问题是,您需要一个完整的外部连接,MySQL不支持这种连接。因此,首先需要从两列中提取所有日期
select date(order_date_time) as d from order_item
union
select date(delivered_date) as d from order_item
在查询中使用左连接
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)
我还将日期格式(..)替换为日期(..)。您可以在外部选择或应用程序中设置日期格式。以后不要使用
descripe
记录表架构。使用show create table order\u项目
。“描述”对任何人来说几乎都是无用的