【问题标题】:Joining 2 or more sql queries using outer join使用外连接连接 2 个或多个 sql 查询
【发布时间】:2020-09-13 10:20:54
【问题描述】:

我尝试使用“外部联接”从 5 条 sql 语句返回结果,我希望将过去 5 天每天的 stock_id、stock_name 和销售额总和作为单独的列返回。我该如何构建它?

select s1.sid as sid,s1.sname as sname, sum1,sum2,sum3,sum4,sum5
from
(
 select stock.id as sid, stock.Name as sname, sum(orders.Quantity) as 'sum1' from orders inner join stock on `Stock_id`= stock.id where  orders.Created_at Like '2020-05-16%' group by Stock_id asc
) 
as s1
full outer join
(
select stock.id as sid,stock.Name as sname, sum(orders.Quantity) as 'sum2' from orders inner join stock on `Stock_id`= stock.id where  orders.Created_at Like '2020-05-17%' group by Stock_id asc
)
as s2 on s1.sid=s2.sid 
outer join
(
select stock.id as sid,stock.Name as sname, sum(orders.Quantity) as 'sum3' from orders inner join stock on `Stock_id`= stock.id where  orders.Created_at Like '2020-05-18%' group by Stock_id asc
) as s3 on s1.sid=s3.sid 
outer join
( 
select stock.id as sid,stock.Name as sname,sum(orders.Quantity) as 'sum4' from orders inner join stock on `Stock_id`= stock.id where  orders.Created_at Like '2020-05-19%' group by Stock_id asc
)as s4 on s1.sid=s4.sid 
outer join
(
select stock.id as sid,stock.Name as sname, sum(orders.Quantity) as 'sum5' from orders inner join stock on `Stock_id`= stock.id where  orders.Created_at Like '2020-05-20%' group by Stock_id asc
)as s5 on s1.sid=s5.sid 

【问题讨论】:

  • GROUP BY后面不能跟ASC。
  • 如果我想按升序排列怎么办?
  • 您的 SQL 语法有误;检查与您的 MariaDB 服务器版本相对应的手册,以了解在“完全外部联接”附近使用的正确语法(选择 stock.id 作为 sid,stock.Name 作为 sname,sum(orders.Quantit)在第 7 行
  • 这是我得到的错误
  • "如果我希望它按升序排列怎么办?" -- 然后使用ORDER BY。但是你不能使用ORDER BY 不限制子查询中的行。但那是另一场球赛。

标签: mysql sql join outer-join


【解决方案1】:

使用条件聚合:

select s.id as sid, s.Name as sname,
       sum(case when date(o.created_at) = '2020-05-16' then o.Quantity end) as sum1,
       sum(case when date(o.created_at) = '2020-05-17' then o.Quantity end) as sum2,
       sum(case when date(o.created_at) = '2020-05-18' then o.Quantity end) as sum3,
       sum(case when date(o.created_at) = '2020-05-19' then o.Quantity end) as sum4,
       sum(case when date(o.created_at) = '2020-05-20' then o.Quantity end) as sum5
from orders o inner join
     stock s
     on o.Stock_id = s.id 
group by s.id;

这要简单得多,不需要挑剔的joins 或子查询。此外,它还修复了日期算法。

【讨论】:

  • 在 MySQL 中,您可以使用 DATE() 代替 TRUNC()。
  • 是的 date() 工作正常。感谢@TheImpaler 和@Gordon Linoff。这对我有用。
  • @Mariwa 。 . . MySQL 不支持full join,因此您尝试的解决方案无论如何都行不通。
  • @Gordon Linoff 如何使用上面的查询将空值转换为零?即 coalesce(column_name,0) as 'name' 或 ifnull(column_name,0)as 'name'
  • 问题对任何人开放。
猜你喜欢
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 2020-12-15
相关资源
最近更新 更多