我需要根据起始字母对列进行分组,然后计算从相应字母开始的列数。这很容易,但我的问题是,如何为列设置名称,这样你就不必多次写同一个东西?
这是我的代码:
SELECT substr(p_nev,1,1) firstLetter, count(substr(p_nev,1,1))
from pizza
group by substr(p_nev,1,1)
order by substr(p_nev,1,1) desc;
注意我必须写substr(p_nev,1,1)4次,所以我想用firstLetter(或某个变量名)以某种方式替换它。
所以这是最优雅的方式吗?
SELECT substr(p_nev,1,1) firstLetter, count(*)
from pizza
group by substr(p_nev,1,1)
order by firstLetter desc;
答案 0 :(得分:2)
您可以使用内部选择
包装查询select fl, count(*)
from (select substr(p_nev,1,1) fl
from pizza)
group by fl
order by fl desc;
在我的练习中,优化器始终足够精细,可以根据执行计划使这些查询等效
答案 1 :(得分:1)
您应该可以使用count(*)
代替count(substr(p_nev,1,1))
和order by firstLetter
代替order by substr(p_nev,1,1)
。您将不得不拼出group by
子句,因为选择列表中的别名会在查询分组后发生。
答案 2 :(得分:1)
作为替代方案,您还可以使用公用表表达式:
with letters as (
SELECT substr(p_nev,1,1) as firstLetter
from pizza
)
select firstletter, count(*) as cnt
from letters
group by firstletter
order by firstletter desc;
公用表表达式(以with letters ..
开头的部分)的行为类似于派生表(“在运行中查看”),如果您需要在更大的表格中多次使用它,则会特别方便查询。
表现明智,对于alko的答案没有区别。