重新格式化 sql 以显示主查询返回 null 的行
Posted
技术标签:
【中文标题】重新格式化 sql 以显示主查询返回 null 的行【英文标题】:Reformat sql to show rows where main query returns null 【发布时间】:2017-03-25 21:05:40 【问题描述】:考虑这个 sql:
SELECT DATE_FORMAT( Orders.Timestamp, '%Y%m' ) AS Period,
SUM(Price) AS 'Ordersum per month and organisation', Orders.Organisation,
(
SELECT SUM(Amount) AS Returns
FROM Returns
WHERE DATE_FORMAT( Returns.Timestamp, '%Y%m' ) = Period
AND Returns.Organisation = Orders.Organisation
) Returns
FROM Orders
GROUP BY Period, Organisation
只要子查询中有行在主查询中没有等效句点,则不会显示该行。原因是查询从订单表中获取其周期,当子查询的周期与订单表中的周期不匹配时,它根本不匹配查询。
有没有办法重新格式化这个查询来实现我想要的?
这里是 Sqlfiddle http://sqlfiddle.com/#!9/ace715/1
【问题讨论】:
你想展示什么? 0? 【参考方案1】:你可以像这样在 UNION 中使用左连接和右连接:
SELECT
ifnull(DATE_FORMAT( Orders.Timestamp,'%Y%m' ),DATE_FORMAT(Returns.Timestamp,'%Y%m' )) AS Period,
SUM(Price) AS 'Ordersum per month and organisation',
ifnull(Orders.Organisation,Returns.Organisation) as 'Organisation',
SUM(Amount) AS 'Returns'
FROM Orders
left JOIN Returns
on DATE_FORMAT( Orders.Timestamp,'%Y%m' ) = DATE_FORMAT(Returns.Timestamp, '%Y%m' )
and Returns.Organisation = Orders.Organisation
GROUP BY Period, Returns.Organisation, Orders.Organisation
union
select ifnull(DATE_FORMAT( Orders.Timestamp, '%Y%m' ),DATE_FORMAT(Returns.Timestamp,'%Y%m' )) AS Period,
SUM(Price) AS 'Ordersum per month and organisation',
ifnull(Orders.Organisation,Returns.Organisation),
SUM(Amount) AS 'Returns'
FROM Orders
right JOIN Returns
on DATE_FORMAT( Orders.Timestamp, '%Y%m' ) = DATE_FORMAT(Returns.Timestamp, '%Y%m' )
and Returns.Organisation = Orders.Organisation
GROUP BY Period, Returns.Organisation, Orders.Organisation
【讨论】:
谢谢,你真是个天才!这正是我想要的:) @aanders77 很高兴你能使用它。也许使用COALESCE
有更有效的方法,但我不完全确定该怎么做。关于JOIN
,只是备注,它们通常在int
列之间完成,因为当它在varchar
或类似的列类型之间完成时,查询持续时间可能很长,在某些情况下JOIN
可能正在工作“显然”相似的值。在这个接受的答案中,第 2 和第 3 段中有一些关于它的细节。 ***.com/questions/3916609/…
我已经阅读了您提到的问题,它们都不适用于我的用例,所以应该没问题 :-) 谢谢以上是关于重新格式化 sql 以显示主查询返回 null 的行的主要内容,如果未能解决你的问题,请参考以下文章