我们是否有解决办法在sql中将别名与“ where”一起使用

时间:2019-01-01 08:57:06

标签: mysql sql

销售:

enter image description here

Q1)返回与上一年相比销售额增长最快的代理商的名称

A)最初,我编写了以下查询

Select name, (sales_2018-sales_2017) as increase 
from sales 
where increase= (select max(sales_2018-sales_2017) 
                 from sales)

我收到一个错误消息,说我不能在关键字“ increase”中使用“ increase”,因为“ increase”不是列而是别名

因此我将查询更改为以下内容:

Select name, (sales_2018-sales_2017) as increase 
from sales 
where (sales_2018-sales_2017)= (select max(sales_2018-sales_2017) 
                                from sales)

该查询确实有效,但是我觉得写这个查询应该更好,即不要写在(sales_2018-sales_2017)=(从sales中选择max(sales_2018-sales_2017))的地方。因此,我想知道是否可以解决在where中使用别名的问题。

Q2)假设表如下,并且要求我们返回EmpId,即连续三年获得A级的姓名:

enter image description here

我写了下面的查询,它的工作原理:

select id,name 
from ratings 
where rating_2017='A' and rating_2018='A' and rating_2019='A'

用AND链接3列(ratings_2017,rating_2018,rating_2019)很容易,我想知道是否有更好的方法将AND链接到列,比如说我们想找到一个连续10年被评为“ A”的员工

Q3)最后但并非最不重要的一点是,我对学习编写中等复杂的SQL查询并使我的SQL技能更上一层楼非常感兴趣。是否有一个网站可以在这方面为我提供帮助?

2 个答案:

答案 0 :(得分:0)

1)您要引用具有表列值的表达式,因此您需要首先定义该表达式(使用内联视图/ cte进行增加)。之后,您可以在查询中引用它     例如:

select * 
  from ( select name, (sales_2018-sales_2017) as increase 
           from sales 
       )x
 where x.increase= (select max(sales_2018-sales_2017) 
                      from sales)

如果您使用的是mysql 8.0,另一种选择是使用解析函数来获得所需的结果

   select * 
     from ( select name
                  ,(sales_2018-sales_2017) as increase 
                  ,max(sales_2018-sales_2017) over(partition by (select null)) as max_increase
              from sales 
           )x
     where x.increase=x.max_increase

Q2)有替代方法可以编写此代码。但基本的问题是表格设计,您要将每个评级年份存储为新列。如果连续这样,那就更容易了。

这是另一种方式

select id,name 
  from ratings 
 where length(concat(rating_2017,rating_2018,rating_2019))-
       length(replace(concat(rating_2017,rating_2018,rating_2019)),'A','')=3

Q3)从hackerrank或https://msbiskills.com/tsql-puzzles-asked-in-interview-over-the-years/中查看一些问题示例。您还可以搜索stackoverflow中的问题和答案,以获得针对人们所面临的棘手问题的解决方案

答案 1 :(得分:0)

Q1:您可以简单地排序和限制查询结果(因此不需要子查询);另外,在ORDER BY子句中允许使用列别名

TIMESTAMP

Q2:您的查询很好;还有其他选择,但是它们不会使它维护起来更快或更容易。

最后,请注意,总体上最好的选择是修改数据库布局:您希望将年度数据放在行中,而不是列中;应该只有一栏存储年份,而不是几列。这将使您的查询更易于编写和维护(并且您无需每年新创建一列...)