获取分组值除以总数
Get grouped value divided by total
我有一个这样的 table :
+----+---------------+----------+
| id | city | price |
+----±---------------±----------+
| 1 | Paris | 2.000,00 |
| 2 | London | 500,00 |
| 3 | Paris | 500,00 |
| 4 | Madrid | 1.000,00 |
±----±---------------±----------±
还有这样的请求:
select
city,
sum(price)
from orders
group by city
order by sum(price) desc
这给了我这样的结果:
+----------+---------------+
| city | SUM(price) |
+----------±---------------±
| Paris | 2.500,00 |
| Madrid | 1.000,00 |
| London | 500,00 |
±----------±---------------±
我想要的是第三列中每个城市的价格比率,这样巴黎就有 62.50% 等等,如下所示:
+----------+---------------+-------------+
| city | SUM(price) | Ratio |
+----------±---------------±-------------+
| Paris | 2.500,00 | 62,50 |
| Madrid | 1.000,00 | 25 |
| London | 500,00 | 12,50 |
±----------±---------------±-------------±
目前,我必须在获得第一个结果集后计算 PHP 中的最后一列。我想知道是否有任何方法可以直接在 SQL 中执行此操作?
您可以使用子查询来获取总价:
select
city,
sum(price),
100.0 * sum(price) / (select sum(price) from Orders) AS Ratio
from Orders
group by city
order by sum(price) desc
或者您可以使用 CROSS JOIN
:
select
city,
sum(price),
100.0 * sum(price) / t.total_price AS Ratio
from Orders
cross join (select sum(price) as total_price from Orders) AS t
group by city
order by sum(price) desc
我建议使用 CTE 来提高阅读能力,但您将获得与 Giorgios 答案相同的性能。
WITH cte0 as (
SELECT *
FROM Orders
WHERE <filters>
),
cte as (
SELECT SUM(price) total
FROM cte0
)
SELECT city, sum(price), 100.0 * SUM(Price) / cte.total
FROM cte0
CROSS JOIN cte
GROUP BY city
我有一个这样的 table :
+----+---------------+----------+
| id | city | price |
+----±---------------±----------+
| 1 | Paris | 2.000,00 |
| 2 | London | 500,00 |
| 3 | Paris | 500,00 |
| 4 | Madrid | 1.000,00 |
±----±---------------±----------±
还有这样的请求:
select
city,
sum(price)
from orders
group by city
order by sum(price) desc
这给了我这样的结果:
+----------+---------------+
| city | SUM(price) |
+----------±---------------±
| Paris | 2.500,00 |
| Madrid | 1.000,00 |
| London | 500,00 |
±----------±---------------±
我想要的是第三列中每个城市的价格比率,这样巴黎就有 62.50% 等等,如下所示:
+----------+---------------+-------------+
| city | SUM(price) | Ratio |
+----------±---------------±-------------+
| Paris | 2.500,00 | 62,50 |
| Madrid | 1.000,00 | 25 |
| London | 500,00 | 12,50 |
±----------±---------------±-------------±
目前,我必须在获得第一个结果集后计算 PHP 中的最后一列。我想知道是否有任何方法可以直接在 SQL 中执行此操作?
您可以使用子查询来获取总价:
select
city,
sum(price),
100.0 * sum(price) / (select sum(price) from Orders) AS Ratio
from Orders
group by city
order by sum(price) desc
或者您可以使用 CROSS JOIN
:
select
city,
sum(price),
100.0 * sum(price) / t.total_price AS Ratio
from Orders
cross join (select sum(price) as total_price from Orders) AS t
group by city
order by sum(price) desc
我建议使用 CTE 来提高阅读能力,但您将获得与 Giorgios 答案相同的性能。
WITH cte0 as (
SELECT *
FROM Orders
WHERE <filters>
),
cte as (
SELECT SUM(price) total
FROM cte0
)
SELECT city, sum(price), 100.0 * SUM(Price) / cte.total
FROM cte0
CROSS JOIN cte
GROUP BY city