Пытаетесь написать запрос, который получит максимальный и минимальный доход, а также напечатает состояние аккаунта? - PullRequest
1 голос
/ 12 марта 2019

Мы пытаемся написать запрос, который показывает нам:

Программы с самым высоким и самым низким доходом и печать их состояния счета

Это то, что мы должны начать:

Вверху

Select TOP 5 * From Health, Revenue
From Program_T, Account_T
Order by Revenue;

Внизу

Select BOTTOM 5 * From Health, Revenue
From Program_T, Account_T
Order by Revenue;

Ниже приведены таблицы:

Program_T Table:

(AccountName varchar(150) not null unique,
ProgramID int not null,
Revenue int,
Advocates int,
Shares int,
Conversions int,
Impressions int,
LaunchDate date,
CSMID int not null,
constraint Program_PK primary key (AccountName, CSMID),
constraint Program_FK1 foreign key (AccountName) references Account_T(AccountName),
constraint Program_FK2 foreign key (CSMID) references CSM_T(CSMID));

Account_T Table:

create table Account_T
(AccountName varchar(150) not null unique,
Health varchar(10) not null,
EcommercePlatform varchar(50),
CSMID int not null,
Industry varchar(50),
Amount int not null,
constraint Accounts_PK primary key (AccountName),
constraint Accounts_FK foreign key (CSMID) references CSM_T(CSMID));

Ответы [ 3 ]

1 голос
/ 12 марта 2019

Предложение для получения ТОП-строк в MySQL: LIMIT. Вы заказываете возрастание или убывание, чтобы получить верхний или нижний ряды. Если вы хотите и то и другое, это означает два запроса, результаты которых вы бы склеили с помощью UNION ALL. И поскольку в каждом запросе есть предложение ORDER BY, вам нужны круглые скобки, чтобы показать СУБД, на что ссылаются предложения ORDER BY. Наконец, вы хотите заключительное предложение ORDER BY, потому что результат UNION ALL не гарантированно будет заказан.

select revenue, health
from
(
  (
    select p.revenue, a.health
    from program_t p
    join account_t a using (accountname)
    order by p.revenue asc limit 5
  )
  union all
  (
    select p.revenue, a.health
    from program_t p
    join account_t a using (accountname)
    order by p.revenue desc limit 5
  )
) glued
order by revenue;

Начиная с MySQL 8, вы также можете использовать ROW_NUMBER для ранжирования ваших строк, что может быть или не быть быстрее:

select revenue, health
from
(
  select
    p.revenue, a.health,
    row_number() over (order by p.revenue asc) as rn1,
    row_number() over (order by p.revenue desc) as rn2
  from program_t p
  join account_t a using (accountname)
) numbered
where rn1 <= 5 or rn2 <= 5
order by revenue;

Что касается объединений, вы можете использовать предложение USING, как показано выше, или использовать ON:

from program_t p
join account_t a on a.accountname = p.accountname
0 голосов
/ 12 марта 2019

Я думаю, вы нашли union all

select * from (
 select * from
 (Select  Health, Revenue 
From Program_T p join Account_T a on p.AccountName =a.AccountName 
Order by Revenue desc limit 5
 )a
 union all
 select * from 
(
Select  Health, Revenue  
From Program_T p join Account_T a on p.AccountName =a.AccountName 
Order by Revenue limit 5
)b) as w
0 голосов
/ 12 марта 2019

Вы хотите UNION ALL:

Select TOP (5) AT.Health, PT.Revenue
From Program_T PT INNER JOIN
     Account_T AT
     ON PT.AccountName = AT.AccountName 
Order by Revenue
LIMIT 5
UNION ALL
Select TOP (5) AT.Health, PT.Revenue
From Program_T PT INNER JOIN
     Account_T AT
     ON PT.AccountName = AT.AccountName
Order by Revenue DESC
LIMIT 5;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...