0

如何使用 MySQL 中的先前值来计算下一个值?我用我蹩脚的英语无法更清楚地解释我的意思(任何人都可以通过看到这篇文章的标题来理解我的问题吗?),所以让我用一个片段来解释它:


select
year_id,
sum(case when event_cd >= 20 then 1 else 0 end) as h,
sum(case when ab_fl = "T" then 1 else 0 end) as ab,
h/ab as ba
from events
group by year_id

在上面的代码段中,当您运行查询时,您会收到错误消息,因为events表中没有hor等​​列ab。但是,我想使用hab在前面的sum(case when ~)语法中计算。我记得有一些方法可以使它成为可能,但是我不记得该怎么做,也不记得我说的那样,由于我的英语不好,我找不到任何相关的帖子来满足我的要求,尽管因为我确定这个问题已经在 SO 上发布,即使您只是链接它而没有详细解释,它也很有帮助。

谢谢。

[更新]

感谢您的回答。我只是想使用以前的值来避免子查询,从而避免大量的冗余输入,并使整个代码更具可读性。正如 Mosty Mostacho 所描述的,我已经使用了两种方法(子查询或两次编写整个语法来计算另一个值),如果这在 MySQL 中使用不可行或风险很大,我当然可以接受上面的这两种方法。对困惑感到抱歉。

4

3 回答 3

1

MySQL 中有两种方法(顺便说一句,我已经稍微简化了查询,但它仍然是合法的):

选项 #1:展开变量

SELECT
  year_id,
  SUM(event_cd >= 20) h,
  SUM(ab_fl = "T") ab,
  SUM(event_cd >= 20) / SUM(ab_fl = "T") ba
FROM events
GROUP BY year_id

选项 #2:使用派生表

SELECT year_id, h, ab, h / ab ba FROM (
    SELECT
      year_id,
      SUM(event_cd >= 20) h,
      SUM(ab_fl = "T") ab
    FROM events
    GROUP BY year_id
) s

您可能会认为第二个会运行得更快,但事实并非如此。第一个最有可能运行得更快,因为它不需要派生表并且只需一次即可解决问题。

于 2013-10-30T15:22:31.467 回答
0

尝试

select * h/ab as ba from 
(
select
year_id,
sum(case when event_cd >= 20 then 1 else 0 end) as h,
sum(case when ab_fl = "T" then 1 else 0 end) as ab,
from events
group by year_id)
source
于 2013-10-30T15:18:40.630 回答
0

更新 正如@MostyMostacho 在下面的评论中解释的那样,这不是一个可取的技术,因为用户变量的评估顺序未定义。


您可以使用 MySQL 变量使用@varname := 'value'存储总和的语法编写查询,然后引用它。

SELECT
  year_id
, @h := SUM(CASE WHEN event_cd >= 20 THEN 1 ELSE 0 END) AS h
, @ab := SUM(CASE WHEN ab_fl = "T" THEN 1 ELSE 0 END) AS ab
, @h/@ab AS ba
FROM events
GROUP BY year_id
于 2013-10-30T15:30:03.143 回答