source

"GROUP BY"의 모든 항목 수에 대한 "카운트(*)"의 백분율 가져오기

manysource 2023. 1. 27. 21:22

"GROUP BY"의 모든 항목 수에 대한 "카운트(*)"의 백분율 가져오기

예를 들어, 「특정 카테고리에서 이용 가능한 아이템 수」와 「전체 아이템 수」의 비율이 필요합니다.다음과 같은 MySQL 테이블을 고려하십시오.

/*

mysql> select * from Item;
+----+------------+----------+
| ID | Department | Category |
+----+------------+----------+
|  1 | Popular    | Rock     |
|  2 | Classical  | Opera    |
|  3 | Popular    | Jazz     |
|  4 | Classical  | Dance    |
|  5 | Classical  | General  |
|  6 | Classical  | Vocal    |
|  7 | Popular    | Blues    |
|  8 | Popular    | Jazz     |
|  9 | Popular    | Country  |
| 10 | Popular    | New Age  |
| 11 | Popular    | New Age  |
| 12 | Classical  | General  |
| 13 | Classical  | Dance    |
| 14 | Classical  | Opera    |
| 15 | Popular    | Blues    |
| 16 | Popular    | Blues    |
+----+------------+----------+
16 rows in set (0.03 sec)

mysql> SELECT Category, COUNT(*) AS Total
    -> FROM Item
    -> WHERE Department='Popular'
    -> GROUP BY Category;
+----------+-------+
| Category | Total |
+----------+-------+
| Blues    |     3 |
| Country  |     1 |
| Jazz     |     2 |
| New Age  |     2 |
| Rock     |     1 |
+----------+-------+
5 rows in set (0.02 sec)

*/

기본적으로 다음과 같은 결과 세트가 필요합니다.

/*
+----------+-------+-----------------------------+
| Category | Total | percentage to the all items | (Note that number of all available items is "9")
+----------+-------+-----------------------------+
| Blues    |     3 |                          33 | (3/9)*100
| Country  |     1 |                          11 | (1/9)*100
| Jazz     |     2 |                          22 | (2/9)*100
| New Age  |     2 |                          22 | (2/9)*100
| Rock     |     1 |                          11 | (1/9)*100
+----------+-------+-----------------------------+
5 rows in set (0.02 sec)

*/

단일 쿼리에서 이러한 결과 세트를 얻으려면 어떻게 해야 합니까?

잘 부탁드립니다.

SELECT Category, COUNT(*) AS Total , (COUNT(*) / (SELECT COUNT(*) FROM Item WHERE Department='Popular')) * 100 AS 'Percentage to all items', 
FROM Item
WHERE Department='Popular'
GROUP BY Category;

MySql 구문은 잘 모르겠지만 그림과 같이 하위 쿼리를 사용할 수 있습니다.

이것으로 충분합니다.

SELECT I.category AS category, COUNT(*) AS items, COUNT(*) / T.total * 100 AS percent
FROM Item as I,
     (SELECT COUNT(*) AS total FROM Item WHERE Department='Popular') AS T
WHERE Department='Popular'
GROUP BY category;
SET @total=0;

SELECT Category, count(*) as Count, count(*) / @total * 100 AS Percent FROM (
    SELECT Category, @total := @total + 1
    FROM Item
    WHERE Department='Popular') temp
GROUP BY Category;

이 방법으로 하는 장점은 이 기능을 복제하지 않아도 된다는 것입니다.WHERE다음 번에 누군가 상태를 업데이트하기 위해 들렀을 때 시한폭탄이 울리지만 다른 두 곳에 있다는 것을 깨닫지 못합니다.

중복 방지WHERE가독성도 향상됩니다.특히,WHERE보다 복잡합니다(복수의 조인 등).

언급URL : https://stackoverflow.com/questions/3061655/getting-percentage-of-count-to-the-number-of-all-items-in-group-by