如何使用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
表中没有h
或ab
这样的列。但是,我想使用先前h
语法中计算的ab
和sum(case when ~)
。我记得有一些方法可以让它成为可能,但我不记得怎么办,也不像我说的那样,由于我的英语不好,我找不到任何相关的帖子来满足我的要求,尽管我确定这个问题已经发布在这里了,即使你只是链接它没有详细解释,它也非常有用。
感谢。
[更新]
感谢您的回答。我只想使用以前的值以避免子查询,从而避免大量冗余类型,并使整个代码更具可读性。我已经使用过两种方法(子查询或写两次整个语法来计算另一个值),如Mosty Mostacho所描述的那样,如果这在MySQL中使用不可行或风险很大,我肯定会接受上述两种方法。对不起,感到困惑。
答案 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