【问题标题】:Syntax error in SQL query: unexpected 'SUM' (sum)SQL 查询中的语法错误:意外的“SUM”(总和)
【发布时间】:2017-12-04 10:07:51
【问题描述】:

我正在尝试运行以下查询,但出现以下错误:

您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 接近'sum(sl.duration)作为持续时间,sum(sl.quantity_loss)作为 数量损失'

SELECT 
   lr.uid AS loss_reason_uid,
   gl.uid AS gl_uid,
   lt.uid AS lt_uid,
   SUM(sl.duration * b.marginal_value_downtime) AS value_loss where en.state = 'downtime',
   SUM(sl.quantity_loss * p.marginal_value) as value_loss where en.state != 'downtime',
   SUM(sl.duration) AS duration,
   SUM(sl.quantity_loss) AS quantity_loss,
   COUNT(*) AS count
FROM
    sub_losses AS sl

知道为什么会出现这种语法错误吗?

【问题讨论】:

  • 您需要group by,但您不能将where 用于sumwhere 子句应用于查询,而不是属性。您可能希望 sum 超过 case 表达式。
  • 显示您的完整查询这些别名是如何定义的en,lr,gl ...
  • 您将两个计算值重命名为 value_loss!
  • 您需要将条件移动到 SUM() 的内部。用例表达式。

标签: mysql sql


【解决方案1】:

试试这个:除了上面的 cmets 之外,不允许在单个查询块中多次使用相同的 ALIASCOLUMN NAME 所以我给了 value_loss1 以使其是唯一的.

SELECT 
   lr.uid AS loss_reason_uid,
   gl.uid AS gl_uid,
   lt.uid AS lt_uid,
   SUM(CASE WHEN en.state = 'downtime' THEN (sl.duration * b.marginal_value_downtime) ELSE 0 END) AS value_loss,
   SUM(CASE WHEN en.state != 'downtime' THEN (sl.quantity_loss * p.marginal_value) ELSE 0 END) AS value_loss1,
   SUM(sl.duration) AS duration,
   SUM(sl.quantity_loss) AS quantity_loss,
   COUNT(*) AS count
FROM sub_losses AS sl
GROUP BY lr.uid,
         gl.uid,
         lt.uid

【讨论】:

  • 我实际上只需要value_loss 列。我已经发布了我的解决方案。谢谢你的回答。
【解决方案2】:

这对我有用。感谢@HoneyBadger 的指导。

SELECT 
    lr.uid AS loss_reason_uid,
        gl.uid AS gl_uid,
        lt.uid AS lt_uid,
        SUM(CASE WHEN en.state = 'downtime' THEN sl.duration * b.marginal_value_downtime ELSE sl.quantity_loss * p.marginal_value END) AS value_loss,
        SUM(sl.duration) AS duration,
        SUM(sl.quantity_loss) AS quantity_loss,
        COUNT(*) AS count
FROM
    sub_losses AS sl

【讨论】:

  • 您仍然需要group by 才能获得可靠的结果。此查询将在较新的 mysql 版本中出错(除非在兼容模式下)。
猜你喜欢
  • 2020-01-14
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
相关资源
最近更新 更多