0

这个查询得到我想要的输出。为了运行它,我必须运行

SET sql_mode = '';

因为否则我会收到一个错误:

SELECT 列表不在 GROUP BY 子句中,并且包含非聚合列“knownLoss.t1.loss”,它在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by 不兼容

SELECT 
  t1.klDate AS LDate
  , t1.Category
  , t1.reason AS Reason
  , sum(t1.loss) AS Loss
  , round(t1.loss / t2.loss,2) AS Percentage
FROM 
  deptkl t1
JOIN (
  SELECT 
      Store
    , sum(loss) AS loss
  FROM
    deptkl
  WHERE 
    klDate >= date_sub(SUBDATE(curdate(), WEEKDAY(curdate())), interval 7 day)
AND 
    klDate < SUBDATE(curdate(), WEEKDAY(curdate()))
AND
    Store = 19
AND
    Department = 80
) t2 ON t1.Store = t2.Store

WHERE 
  klDate >= date_sub(SUBDATE(curdate(), WEEKDAY(curdate())), interval 7 day)
  AND 
  klDate < SUBDATE(curdate(), WEEKDAY(curdate()))
  AND
  t1.Store = 19
AND
  Department = 80
GROUP BY
  klDate
, Category
, reason

当我将它放入 Jasper Studio 的数据集和查询对话框时,我得到了同样的错误,我无法使用 SET sql_mode = ''; 命令。有什么想法吗?如果有一种方法可以在不使用 SET sql_mode = ''; 的情况下实现这一点?

4

2 回答 2

1

我猜错误来自您选择的这一行:

round(t1.loss / t2.loss,2) AS Percentage

由于 youGROUP BY子句不包括此列,因此将使用哪个t1.loss和值有点像掷硬币。t2.loss在某些情况下,根据您的标准,这些值碰巧总是相同的,因此无论如何您都会得到正确的结果,但是数据库仍然会抱怨,因为它被要求为这些列返回一些任意的结果。解决这个问题的一种方法是简单地将聚合函数应用于有问题的列,如下所示:

round(min(t1.loss) / min(t2.loss),2) AS Percentage

或者...

round(avg(t1.loss) / avg(t2.loss),2) AS Percentage
于 2017-04-02T06:27:33.377 回答
0

我想你想这样做:

round(sum(t1.loss / t2.loss)/count(*),2)  AS Percentage

这将计算结果中每条记录的平均损失的总和,然后将其除以该组的记录计数,就像平均值的平均值。

编辑:

抱歉,我现在犯了一个语法错误,它应该给出想要的结果,错误是因为您没有在不在 group by 子句中的列上使用聚合函数

于 2017-04-02T08:15:49.580 回答