【问题标题】:Averaging column values in rows平均行中的列值
【发布时间】:2013-11-18 06:18:06
【问题描述】:

我正在尝试查询 BIRT 中的图表。我有一个类似于以下的表格:

id   score_1   score_2   score_3
1     80.5       81.2      81.3
2     90.1       88.9      87.1
3     85.6       87.5      84.8

我需要做的是获取每个分数列的平均值并将它们按如下所示的行输出:

   score    average
     1       85.4
     2       85.87
     3       84.4

在 UNION 中尝试了一段时间并且缺少一系列查询,有没有更有效的方法来解决这个问题?请注意,该表还连接到用于过滤的其他表。

【问题讨论】:

  • 是否需要sql查询才能得到3列的平均值?
  • 是的,这将被图表用作数据源。
  • 分数有固定数量吗?所以你总是有 3 行(或 5 行或其他)?如果不一致,是否有不会超过的最大行数(即永远不会超过 Score_9)

标签: java mysql birt


【解决方案1】:

知道了。您想要行中的输出。截至目前,MySQL 中似乎还没有现成的TRANSPOSE 函数。我能想到的最好的就是这个,我相信你已经尝试过了。

SELECT score_id, score_avg 
FROM (
  SELECT '1' as score_id, avg(score_1) as score_avg FROM scores
  UNION
  SELECT '2' as score_id, avg(score_2) as score_avg FROM scores
  UNION
  SELECT '3' as score_id, avg(score_3) as score_avg FROM scores
  ) as transpose_table;

SQL Fiddle Link

【讨论】:

  • 不幸的是,我无法将它们输出为这样的列,它对于将使用它的 BIRT 图表显示不正确。
【解决方案2】:
SELECT (score_1 + score_2 + score_3)/3 as AVERAGE
FROM scores;

你可以使用联合

SELECT AVG(score_1)FROM scores
UNION
select AVG(score_2) FROM scores
UNION
select AVG(score_3) FROM scores

【讨论】:

  • 这只是平均每个 id 的分数,我需要平均每个分数。
  • 我已经提到我试图避免使用 UNION 链接 select 语句,因为有许多其他表连接到该表以及用于过滤的参数。
  • 你想要实现的在sqlserver中被称为PIVOT。但是在 MySql 中它有点困难。您可以查看以下链接en.wikibooks.org/wiki/Programming:MySQL/Pivot_table
猜你喜欢
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
  • 2019-04-03
相关资源
最近更新 更多