Суммируйте несколько столбцов и суммируйте их псевдоним в mysql - PullRequest
0 голосов
/ 02 февраля 2020

Возможно ли sum столбцы и сумма снова?

select 
id,
sum(t2.col) as cola,
sum(t3.col) as colb,
sum(t4.col) as colc,
sum(cola + colb + colc) as total
from t1
left join t2 on t2.id = t1.t2fk
left join t3 on t3.id = t1.t3fk
left join t4 on t4.id = t1.t4fk
group by t1.id

что-то вроде этого

sum(cola + colb + colc) as total

Ответы [ 3 ]

0 голосов
/ 02 февраля 2020

Да, это возможно с помощью вложенного запроса.

SELECT id, cola, colb, colc, SUM(cola + colb + colc)
  FROM  (
      SELECT id, SUM(a) cola, SUM(b) colb, SUM(c) colc
        FROM whatever ...
       GROUP BY id
        ) subquery_alias
 GROUP BY id

Большинство модулей планирования запросов серверов хорошо справляются с оптимизацией таких запросов, построенных из подзапросов.

Совет для профессионалов Тщательно отформатируйте эти вложенные запросы в своем исходном коде, чтобы вы или кто-либо другой могли легко их прочитать спустя годы.

0 голосов
/ 02 февраля 2020

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

with cte as (
  select id, sum(t2.col) as cola, sum(t3.col) as colb, sum(t4.col) as colc
  from t1
  left join t2 on t2.id = t1.t2fk
  left join t3 on t3.id = t1.t3fk
  left join t4 on t4.id = t1.t4fk
  group by t1.id
)
select c.*, null as total
from cte as c
union all
select null, null, null, null, sum(cola + colb + colc)
from cte

Для более ранних версий:

select id, sum(t2.col) as cola, sum(t3.col) as colb, sum(t4.col) as colc, null as total
from t1
left join t2 on t2.id = t1.t2fk
left join t3 on t3.id = t1.t3fk
left join t4 on t4.id = t1.t4fk
group by t1.id
union all
select null, null, null, null, sum(t2.col + t2.col + t2.col)
from t1
left join t2 on t2.id = t1.t2fk
left join t3 on t3.id = t1.t3fk
left join t4 on t4.id = t1.t4fk

В случае, если в столбцах null s t2.col, t3.col и t4.col вместо

sum(t2.col + t2.col + t2.col)

используйте:

sum(t2.col) + sum(t2.col) + sum(t2.col)
0 голосов
/ 02 февраля 2020

Вы не можете сделать это с псевдонимами, но вы можете сделать это, переписав предложения SELECT, например:

select 
id,
sum(t2.col) as cola,
sum(t3.col) as colb,
sum(t4.col) as colc,
sum(t2.col) + sum(t3.col) + sum(t4.col) as total
from t1
left join t2 on t2.id = t1.t2fk
left join t3 on t3.id = t1.t3fk
left join t4 on t4.id = t1.t4fk
group by t1.id

Не будет никакого снижения производительности (то есть MySQL не будет «повторно суммировать» три столбца, чтобы получить итоговое значение)

...