mysql在获取某个字段的列表数据,同时获取这个字段的求和数,用于计算占比,并排序

mysql在获取某个字段的列表数据,同时获取这个字段的求和数,用于计算占比,并排序?
例如,表a 结构是:

idqty
110
212
315
我需要查询出来的数据是
idqtytotal_qtyratio
110370.27
212370.32
315370.41

语句需要支持按ratio排序。

我能想到的是:

SELECT
    id,
    qty,
    total_qty,
    ROUND( qty / total_qty, 2 ) AS ratio 
FROM
    ( SELECT id, qty, ( SELECT sum( qty ) AS total FROM test_a ) AS total_qty FROM test_a ) AS t 
ORDER BY
    ratio DESC

请教下,是否还有别的写法?


with test_a as
(
    select 1 as id,10 as qty
    union all
    select 2,12
    union all
    select 3,15
)

select
    t.*
    ,sum(t.qty) over() as total_qty
    ,round(t.qty *1.0 / sum(t.qty) over(),2) as ratio
from
    test_a t

【以下回答由 GPT 生成】

SELECT 
    id, 
    qty, 
    (SELECT SUM(qty) FROM a) AS total_qty,
    ROUND(qty / (SELECT SUM(qty) FROM a), 2) AS ratio
FROM 
    a
ORDER BY 
    ratio DESC

上述SQL语句可以实现您的需求。以下是解决问题的步骤:

  1. 在主查询中选择 id 和 qty 列。主查询用于获取列表数据。
  2. 在主查询中使用子查询来获取该字段的总和。子查询(SELECT SUM(qty) FROM a)返回了字段 qty 的总和,并将其命名为 total_qty。
  3. 使用 ROUND 函数将每个字段的占比保留两位小数。
  4. 使用 FROM 子句指定要查询的表。
  5. 使用 ORDER BY 子句按照占比进行降序排序。DESC 表示降序,即占比高的排在前面。

这种写法避免了使用多层子查询,提高了查询性能。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^