使用MySQL中的先前值来计算下一个字段?

时间:2013-10-30 15:15:18

标签: mysql sql

如何使用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表中没有hab这样的列。但是,我想使用先前h语法中计算的absum(case when ~)。我记得有一些方法可以让它成为可能,但我不记得怎么办,也不像我说的那样,由于我的英语不好,我找不到任何相关的帖子来满足我的要求,尽管我确定这个问题已经发布在这里了,即使你只是链接它没有详细解释,它也非常有用。

感谢。

[更新]

感谢您的回答。我只想使用以前的值以避免子查询,从而避免大量冗余类型,并使整个代码更具可读性。我已经使用过两种方法(子查询或写两次整个语法来计算另一个值),如Mosty Mostacho所描述的那样,如果这在MySQL中使用不可行或风险很大,我肯定会接受上述两种方法。对不起,感到困惑。

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分: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

答案 2 :(得分: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