[英]sql merge two queries result
使用xampp mysql
Q1:
SELECT truckid, count(deliveryid)
FROM `delivery`
WHERE year(deliverydate)=2019 and month(deliverydate)=1
GROUP BY truckid
Q2:
SELECT truckid,count(deliverid)
FROM `delivery2`
WHERE YEAR(ddate)=2019 and MONTH(ddate)=1
GROUP BY truckid
我正在尝试获得4色的一页结果,让我在它们之间进行比较
我上个月已经做完了,我想我使用了左联接,但现在似乎无法使它起作用:(
救命 。
您可以使用union all
并进行条件聚合:
select truckid,
sum( tbl = 'delivery' ) as delivery_count,
sum( tbl = 'delivery2' ) as delivery2_count
from (select truckid, deliveryid, 'delivery' as tbl
from delivery
where year(deliverydate) = 2019 and month(deliverydate) = 1
union all
select truckid, deliverid, 'delivery2'
from delivery2
where YEAR(ddate) = 2019 and MONTH(ddate) = 1
) t
group by truckid;
您可以通过UNION
来模拟FULL OUTER JOIN
,将LEFT JOIN
与RIGHT JOIN
,如下所示:
with
a (truckid, cnt) as ( -- query #1
SELECT truckid, count(deliveryid)
FROM delivery
WHERE year(deliverydate) = 2019
and month(deliverydate) = 1
group by truckid
),
b (truckid, cnt) as ( -- query #2
SELECT truckid, count(deliverid)
FROM delivery2
WHERE YEAR(ddate) = 2019
and MONTH(ddate) = 1
GROUP BY truckid
)
select -- now the full outer join
from a.truck_id, a.cnt as a_cnt, b.cnt as b_cnt
left join b on a.truck_id = b.truck_id
union
select
from b.truck_id, a.cnt as a_cnt, b.cnt as b_cnt
right join b on a.truck_id = b.truck_id
我可以这样写:
select truckid, max(delivery1) as delivery1, max(delivery2) as delivery2
from ((select truckid, count(*) as delivery1, 0 as delivery2
from delivery
where deliverydate >= '2019-01-01' and deliverydate < '2019-01-02'
group by truckid
)
union all
(select truckid, 0, count(*) as delivery2
from delivery2
where deliverydate >= '2019-01-01' and deliverydate < '2019-01-02'
group by truckid
)
) t
group by truckid;
我认为这是最有效的方法。
首先,日期范围允许使用索引。
其次,单个表上的group by
是较小的数据。 GROUP BY
标度比线性标度更差,因此较小的值更好。
UNION ALL
也在较小的数据上。
而且,为方便起见,不需要直接使用条件逻辑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.