Mysql SQL查询:在SUM()上联接

Mysql SQL查询:在SUM()上联接,mysql,sql,Mysql,Sql,我正在尝试运行一个查询,对项的值求和,然后对该和的值进行联接 所以在下面的代码中,我想加入的是合同,但我不确定这是否可行 SELECT `items_value`.`ContractId` as `Contract`, `items_value`.`site` as `SiteID`, SUM(`items_value`.`value`) as `Contract_For`, `contractitemlists`.`Text` as `Contracted_Text` FROM items_v

我正在尝试运行一个查询,对项的值求和,然后对该和的值进行联接

所以在下面的代码中,我想加入的是合同,但我不确定这是否可行

SELECT `items_value`.`ContractId` as `Contract`,
`items_value`.`site` as `SiteID`,
SUM(`items_value`.`value`) as `Contract_For`,
`contractitemlists`.`Text` as `Contracted_Text`
FROM items_value
LEFT JOIN contractitemlists ON (`items_value`.`Contract_For`) =  `contractitemlists`.`Ref`;
WHERE `items_value`.`ContractID`='2';
当我在过去遇到类似的问题时,我只是创建了一个保存总和的视图,然后在另一个视图中加入该视图


目前,上面的示例仅适用于一个伪值,但它是一个存储过程,用户可以在其中选择压缩。我现在遇到的错误是“未知列
项目\u值”
合同\u For
除了HAVING and ORDER BY*,您不能在任何地方使用别名或使用SELECT子句中的表达式进行聚合;您需要使第一个“部分”成为子查询,然后连接到该子查询

它可能更容易理解,虽然有点过于简单,也不完全正确,但如果你按照评估的顺序来看待它

  • FROM(注意:联接仅在FROM内)
  • 在哪里
  • 分组
  • 挑选
  • 拥有
  • 订购人
在实际实现中,“在引擎盖下”,大多数SQL实现实际上使用来自每个部分的信息来优化其他部分(比如使用一些where条件来减少加入from的记录);但这是必须遵守的概念秩序

*在MSSQL的某些版本中,您不能使用“在中选择”或“按顺序选择”中的别名


您的查询需要如下所示:

SELECT s.*
   , `cil`.`Text` as `Contracted_Text`
FROM (
   SELECT `iv`.`ContractId` as `Contract`
         , `iv`.`site` as `SiteID`
         , SUM(`iv`.`value`) as `Contract_For`
   FROM items_value AS iv
   WHERE `iv`.`ContractID`='2'
) AS s
LEFT JOIN contractitemlists AS cil ON `s`.`Contract_For` =  cil.`Ref`
;

但正如其他人所提到的,缺少一个团队是需要研究的;如“如果有多个站点值,该怎么办?”

您不能在任何地方使用SELECT子句中的表达式来使用别名或聚合,只能使用and ORDER BY*;您需要使第一个“部分”成为子查询,然后连接到该子查询

它可能更容易理解,虽然有点过于简单,也不完全正确,但如果你按照评估的顺序来看待它

  • FROM(注意:联接仅在FROM内)
  • 在哪里
  • 分组
  • 挑选
  • 拥有
  • 订购人
在实际实现中,“在引擎盖下”,大多数SQL实现实际上使用来自每个部分的信息来优化其他部分(比如使用一些where条件来减少加入from的记录);但这是必须遵守的概念秩序

*在MSSQL的某些版本中,您不能使用“在中选择”或“按顺序选择”中的别名


您的查询需要如下所示:

SELECT s.*
   , `cil`.`Text` as `Contracted_Text`
FROM (
   SELECT `iv`.`ContractId` as `Contract`
         , `iv`.`site` as `SiteID`
         , SUM(`iv`.`value`) as `Contract_For`
   FROM items_value AS iv
   WHERE `iv`.`ContractID`='2'
) AS s
LEFT JOIN contractitemlists AS cil ON `s`.`Contract_For` =  cil.`Ref`
;

但正如其他人所提到的,缺少一个团队是需要研究的;如“如果有多个站点值会怎样?”

倒数第二行的分号看起来不太好。没有GROUPBY子句的聚合函数有点奇怪(但并非不可能),倒数第二行的分号看起来不太好。没有GROUPBY子句的聚合函数有点奇怪(但并非不可能),这不是计算顺序!这是查询中作用域标识符使用的顺序。理解作用域和执行之间的区别是非常非常重要的。@GordonLinoff编辑的目的是让我“有点像这样,但不完全是这样”的意图更加明显;我以为我已经用“引擎盖下”部分很好地覆盖了它,但显然没有。@Uuerdo非常感谢,我会看看我能做些什么。在这种情况下,每个契约都是针对一个站点的,所以它们在parityYeah中应该是1:1,如果它们是1:1,那就不是一个真正的问题(除了较新的MySQL版本上的默认配置在GROUP BY requirements中稍微严格一点)。这不是评估的顺序!这是查询中作用域标识符使用的顺序。理解作用域和执行之间的区别是非常非常重要的。@GordonLinoff编辑的目的是让我“有点像这样,但不完全是这样”的意图更加明显;我以为我已经用“引擎盖下”部分很好地覆盖了它,但显然没有。@Uuerdo非常感谢,我会看看我能做些什么。在这种情况下,每个契约都是针对一个站点的,所以它们在parityYeah中应该是1:1,如果它们是1:1,那么这实际上不是一个问题(除了较新的MySQL版本上的默认配置在GROUP BY需求中稍微严格一点)。