3

我有一个查询,用于计算循环每月固定器的信息。该项目每个月都有一定的小时数分配给它,每个月的不同时间段开始(例如,2 月 5 日至 3 月 4 日)。查询结果的列包括:

  1. 项目名称
  2. 记录的总小时数
  3. 每月剩余小时数
  4. 期间的最后一天
  5. 剩余天数

例如,项目 A 记录了 15 个小时,每月剩余 5 个小时。期间的最后一天是 11 月 17 日,距离今天还有 3 天。

当前查询使用 4 个使用左连接连接的表来打印所有客户端,即使没有记录小时数,然后它使用嵌套子查询(第 8-86 行)来计算第 2、3、4 和 5 列. 但是,第 4 列和第 5 列不打印,它们只是显示为始终为 NULL。(这些是期间的最后一天和剩余天数)。

您可以在此处的 SQL fiddle 链接中查看架构 + 查询代码:http ://sqlfiddle.com/#!2/fc830/12

当没有记录小时数时,如何获取第 4 列和第 5 列来打印数据并且不为空?我想我可能需要额外的左连接,但我无法获得解决方案。如果您有任何建议,将不胜感激。谢谢!

4

2 回答 2

2

当没有记录小时数时,嵌套查询的左连接会为您遇到问题的列返回空值。

答案是在它们为空时为它们提供值,ifnull()当左连接返回空值时我们使用这些值:

select
...
ifnull(<left joined value>, <value when there's no join>),
...

请参阅sqlfiddle 中的工作解决方案


顺便说一句,您从内部查询返回的某些值,特别是“最后一天”值可以直接派生自client(如我的解决方案中所示)。最好让您的查询尽可能简单——当有更简单或更直接的方式时,不要以复杂的方式获取数据。

于 2012-11-14T18:13:35.490 回答
1

我认为您对LEFT JOIN. LEFT JOIN结果是外部表中的所有行。否则称为LEFT Outer JOIN(相反RIGHT OUTER JOIN)。在您的情况下,内部查询仅产生客户端 id = 4 的记录。请参阅最后一个子句X on X.id=client.id。现在你期望结果是什么?

OUTER TABLE (client table)
id = 1, 2, 3, 4

INNER TABLE 
client id = 4

ON X.id=client.id

AnINNER JOIN只会产生一条记录,因为只有匹配的记录 - 对于 id = 4。

但是 LEFT JOIN 会导致外部表中的所有 4 条记录,但无效字段的值将是NULL。这里除了客户端 id 4 之外,没有来自内部表的有效记录,因此它们将为空。

为了更清楚,您必须查看记录中的 id 字段。试试这个小提琴

您可以看到有关如何填写这些NULL字段的其他答案。

于 2012-11-14T18:15:52.127 回答