重新格式化 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 的行的主要内容,如果未能解决你的问题,请参考以下文章

mongodb 查询数据

sql语句返回类型为hashmap的时候空值的字段会显示吗

格式化查询以在 Oracle SQL 中显示浮点小数

SQL查询和计算;正确格式化查询以仅选择 id

有层级的,怎么用sql查询返回结果

SQL多表多字段联合查询怎么弄?最终结果用HTML页面以表格形式显示(表格已有,类似excel)。