У нас есть обходной путь, чтобы использовать псевдоним с «где» в SQL - PullRequest
0 голосов
/ 01 января 2019

Продажи:

enter image description here

Q1) Вернуть имя агента, у которого был самый высокий рост продаж по сравнению с предыдущим годом

А) Первоначально я написал следующий запрос

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

Я получил ошибку, в которой говорится, что я не могу использовать увеличение с ключевым словом, поскольку "увеличение" - это не столбец, а псевдоним

Я изменил запрос следующим образом:

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

Этот запрос сработал, но я считаю, что лучше написать этот queryi.e вместо того, чтобы писать где (sales_2018-sales_2017) = (выберите max (sales_2018-sales_2017) от продаж).Поэтому мне было интересно, есть ли обходной путь использования псевдонима с помощью где.

Q2) предположим, что таблица выглядит следующим образом, и нас просят вернуть EmpId, имя, получившее рейтинг A в течение 3 лет подряд:

enter image description here

Я написал следующий запрос:

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

Цепочка 3 столбцов (рейтинги_2017, рейтинг_2018, рейтинг_2019) с ANDэто просто, я хочу знать, есть ли лучший способ связать столбцы с помощью AND, когда мы скажем, что мы хотим найти сотрудника с рейтингом «А» в течение 10 лет подряд.

Q3) Последнее, но не менее важное,Я действительно заинтересован в том, чтобы научиться писать сложные SQL-запросы среднего уровня и поднять свои навыки SQL на следующий уровень.Есть ли какой-нибудь сайт, который может мне помочь в этом отношении?

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Q1: вы можете просто упорядочить и ограничить результаты запроса (следовательно, подзапрос не требуется);кроме того, псевдонимы столбцов разрешены в предложении ORDER BY

SELECT 
    name,
    sales_2018-sales_2017 as increase 
FROM sales 
ORDER BY increase DESC
LIMIT 1

Q2: ваш запрос в порядке;существуют другие варианты, но они не сделают его более быстрым или простым в обслуживании.

Наконец, обратите внимание, что в целом лучшим вариантом будет изменение структуры базы данных: вы хотите, чтобы годовые данные были в строках, а не вколонны;должен быть только один столбец для хранения года вместо нескольких.Это упростит написание и обслуживание ваших запросов (и вам не нужно будет создавать новый столбец каждый новый год ...)

0 голосов
/ 01 января 2019

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, чтобы найти решения сложных проблем, с которыми сталкивались люди

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...