MariaDb: как найти математический расчет на основе производных результатов в SELECT - PullRequest
1 голос
/ 07 мая 2020

У меня большой SQL вот так:

(MariaDb V5.5.65)

SELECT ....,
...,
SUM(BJ.intake) as intakeX,
(SELECT SUM(ibj.intake) FROM ibj WHERE ibj.p2p3 = 'P3' AND ne.see_id = ibj.ee_id ) as p3count,
...,
...
FROM NewEstablished ne  
INNER JOIN BlindJob BJ ON ...
WHERE ... 

Это отлично работает.

Однако мне нужно добавить производный столбец, который является соотношением p3count / intakeX * 100. Оба производных значения являются десятичными, но я не могу найти, как ссылаться на них в select:

SELECT ....,
...,
SUM(BJ.intake) as intakeX,
(SELECT SUM(ibj.intake) FROM ibj WHERE ibj.p2p3 = 'P3' AND ne.see_id = ibj.ee_id ) as p3count,
(p3count / intakeX * 100) as ratio, 
...,
...
FROM NewEstablished ne  
INNER JOIN BlindJob BJ ON ...
WHERE ... 

Это возвращает ошибку, что p3count / intakeX являются неизвестными столбцами.

Я видел в другом месте, что эти производные столбцы выбора установлены как часть таблицы FROM (в данном случае ne), но это тоже не работает.

Как я могу ссылаться на эти значения SELECT, чтобы выполнить дальнейшие вычисления для них в качестве нового столбца вывода?

Пример вывода:

intakeX = 25
p3count = 2
ratio = 8

1 Ответ

2 голосов
/ 07 мая 2020

Вы можете использовать свой запрос как подзапрос и вычислить новый столбец:

select t.*,
  (t.p3count / t.intakeX * 100) as ratio
from (
  <your query>
) t

или для MySql 8.0+ вы можете использовать CTE:

with CTE as (
  <your query>
)
select *,
  (p3count / intakeX * 100) as ratio
from cte

другой вариант - повторить те же выражения:

SELECT ....,
...,
SUM(BJ.intake) as intakeX,
(SELECT SUM(ibj.intake) FROM ibj WHERE ibj.p2p3 = 'P3' AND ne.see_id = ibj.ee_id ) as p3count,
(
  (SELECT SUM(ibj.intake) FROM ibj WHERE ibj.p2p3 = 'P3' AND ne.see_id = ibj.ee_id ) / 
  SUM(BJ.intake) * 
  100
) as ratio, 
...,
...
FROM NewEstablished ne  
INNER JOIN BlindJob BJ ON ...
WHERE ... 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...