我使用的是mysql工作台8.0
我正在自学 SQL,目前正在开始一些带有大量谷歌搜索的指导项目。现在我正在处理this数据:
这是我正在处理的相关部分:
分行 | 客户类型 |
---|---|
A | 会员 |
C | 正常 |
A | 正常 |
A | 会员 |
B | 正常 |
不断地。我目前拥有的是以下内容:
分行 | 客户类型 | cust_num |
---|---|---|
A | 会员 | 167 |
A | 正常 | 173 |
B | 会员 | 165 |
B | 正常 | 167 |
C | 会员 | 169 |
C | 正常 | 159 |
我想要的是 cust_num 列旁边的另一列,其中包含每种类型每个分支机构的总客户百分比,所以基本上:
分行 | 客户类型 | cust_num | 百分比 |
---|---|---|---|
A | 会员 | 167 | 49 |
A | 正常 | 173 | 51 |
B | 会员 | 165 | 50 |
B | 正常 | 167 | 50 |
C | 会员 | 169 | 52 |
C | 正常 | 159 | 48 |
这是我尝试过的 2 个最有前途的解决方案
with rawdata as
(SELECT branch, `Customer Type`, count(`Customer Type`) as type_count
from sales
group by 1)
groupeddata as
(SELECT `Customer Type`, count(`Customer Type`) as totalcust
from sales
Group by 1
)
SELECT r.branch, r.`Customer Type`, r.type_count, r.type_count/g.totalcust * 100.0 as percentage
from rawdata r
JOIN groupeddata g on r.`customer type` = g.`customer type`
order by 1
这给了我一个我认为的客户类型百分比,但我想要一个分支机构内的客户类型百分比。我还尝试将分支放入分组数据中,并将其放入代码的 JOIN 部分,但随后百分比全部更改为 100%
以防万一我想太多了,我尝试了
select branch, `customer type`, count(`customer type`) as type_count,
(SELECT count(`customer type`)/sum(`Customer type`)) As percentage from sales
group by 1,2
order by 1
返回空值。我知道问题是 sum(
customer type
),因为它不是一个数字,但是当我尝试将其切换到 type_count/count(customer type
) 时,它给了我一个错误,指出 type_count 不存在
使用
SUM(cust_num)
获取每个分店的客户总数,而不是count(`Customer Type`)
。这是行数,而不是顾客数量。
WITH total_cust AS (
SELECT branch, SUM(cust_num) AS total
FROM sales
GROUP BY branch
)
SELECT s.*, ROUND(100 * s.cust_num / t.total) AS percentage
FROM sales AS s
JOIN total_cust AS t ON s.branch = t.branch
ORDER BY s.branch, s.`Customer Type`