SQL查询:在SUM()上联接

时间:2018-08-29 16:35:48

标签: mysql sql

我正在尝试运行一个查询,该查询对项的值求和,然后对那个SUM的值进行JOIN。

因此在下面的代码中,Contract_For是我要加入的内容,但是我不确定是否可行。

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';

过去我遇到类似的问题时,我刚刚创建了一个包含SUM的视图,然后在另一个视图中加入了该视图。

目前,以上示例仅适用于一个哑数值,但旨在存储过程,用户可以在其中选择ContractID。我目前遇到的错误是“未知列items_valueContract_For

1 个答案:

答案 0 :(得分:2)

除了HAVING和ORDER BY *,您不能在其他任何地方使用别名或使用SELECT子句中的表达式进行汇总;您需要将第一个“ part”作为子查询,然后将其加入。

如果您以这种方式看待评估顺序,则可能会更容易理解,尽管它有点过分简化并且不够准确。

  • FROM (注意:JOIN仅在FROM中)
  • 位置
  • 选择
  • 拥有
  • ORDER BY

在实际的实现中,大多数SQL实现实际上使用每个节中的信息来优化其他节(例如使用某些条件减少在FROM中联接的记录);但这是必须遵守的概念顺序。

*在某些版本的MSSQL中,您不能在HAVING或ORDER BY中使用SELECT中的别名。


您的查询必须是这样的:

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`
;

但是,正如其他人所提到的,缺少GROUP BY是值得研究的。就像“如果有多个网站值一样。”