#mysql #sql
#mysql #sql
Вопрос:
Я новичок в MySQL. Я использую MySQL 8.0.
Моя схема и образцы данных выглядят следующим образом:
CREATE TABLE AA (
A int
);
insert into AA (A) values (1);
insert into AA (A) values (1);
insert into AA (A) values (2);
insert into AA (A) values (2);
insert into AA (A) values (1);
insert into AA (A) values (3);
CREATE TABLE BB (
code int,
description varchar(30)
);
insert into BB (code, description) values (1, 'Male');
insert into BB (code, description) values (2, 'Female');
Вот мой код
with totalcount as (
select code as 'CODE',
description as 'SEX',
count(A) AS 'TOTAL',
ROUND((COUNT(A) * 100.0) / (SELECT COUNT(A) FROM AA),2) AS 'PERCENT',
sum(count(A)) over (order by CODE asc) AS 'CUMULATIVE',
ROUND((SUM(COUNT(A)) OVER (ORDER BY CODE ) / (SELECT COUNT(A) FROM AA) *100 ),2) AS 'CUMPERCENT'
from AA, BB
where AA.A= BB.code
group by AA.A
)
select *
from totalcount
UNION ALL
SELECT '0' CODE, 'TOTAL' SEX, SUM(TOTAL), SUM(PERCENT), '0' CUMULATIVE, '0.00' CUMPERCENT
from totalcount
ORDER BY CODE;
Результат был таким
CODE | SEX | TOTAL | PERCENT | CUMULATIVE | CUMPERCENT
0 TOTAL 5 100.00 0 0.00
1 MALE 3 60.00 3 60.00
2 FEMALE 2 40.00 5 100.00
Я использовал UNION
, так как мне нужно общее количество этих элементов. В этом случае я вставил 0
TOTAL
SEX
столбец of, чтобы поместить его в первую строку. Есть ли другой способ, кроме использования UNION
и вставки кода 0
?
Как вы можете видеть из моей таблицы BB, есть только код 1 и 2 для мужского и женского пола соответственно. Я хочу показать, что значение, которого нет в этой таблице, должно быть in NOT VALID
.
CODE | SEX | TOTAL | PERCENT | CUMULATIVE | CUMPERCENT
0 TOTAL 6 100.00 0 0.00
1 MALE 3 50.00 3 50.00
2 FEMALE 2 33.33 5 83.33
3 NOT VALID 1 16.67 6 100.00
Можете ли вы помочь мне с этим? Спасибо.
Комментарии:
1. пожалуйста, создайте dbfiddle с таблицей и данными. итак, мы можем вам помочь
2. db-fiddle.com/f/jYQJPV1X1XPbLp72LqA5CZ/0
3. У вас нет PK в вашей первой таблице. Исправьте это.
Ответ №1:
Это очень сложный вопрос отчетности. Один из подходов используется GROUP BY ROLLUP
для генерации общей строки наряду с разумным использованием COALESCE
для заполнения недостающих значений в соответствии с вашими требованиями.
SELECT
COALESCE(t1.A, 0) AS CODE,
CASE WHEN t1.A IS NOT NULL THEN COALESCE(t2.DESCRIPTION, 'NOT VALID') ELSE 'TOTAL' END AS SEX,
t1.TOTAL,
ROUND(100.0 * t1.TOTAL / SUM(CASE WHEN t1.A IS NOT NULL THEN t1.TOTAL ELSE 0 END) OVER (), 2) AS PERCENT,
SUM(CASE WHEN t1.A IS NOT NULL THEN t1.TOTAL ELSE 0 END) OVER (ORDER BY t1.A) AS CUMULATIVE,
ROUND(100.0 * SUM(CASE WHEN t1.A IS NOT NULL THEN t1.TOTAL ELSE 0 END) OVER (ORDER BY t1.A) /
SUM(CASE WHEN t1.A IS NOT NULL THEN t1.TOTAL ELSE 0 END) OVER (), 2) AS CUMPERCENT
FROM
(
SELECT
A,
COUNT(*) AS TOTAL
FROM AA
GROUP BY A WITH ROLLUP
) t1
LEFT JOIN BB t2
ON t2.CODE = t1.A
ORDER BY
CODE;
ДЕМОНСТРАЦИЯ
Комментарии:
1. Большое вам спасибо. И последний, последний вопрос: могу ли я исключить столбец для «КОДА», но он все равно будет отображать ту же сортировку для столбца «ПОЛ»?
2. Да, вы можете .
3. Я обновил базу данных. Я просто добавляю данные с нулевым значением. Я просто хочу добавить еще одну строку для этого нулевого значения. Вот обновленная база данных
4. db-fiddle.com/f/jYQJPV1X1XPbLp72LqA5CZ/1
5. @CarloKarganilla Я не буду редактировать свой ответ, который уже ответил на ваш первоначальный вопрос. Если у вас есть последующие действия, пожалуйста, задайте другой вопрос. Формат Stack Overflow не относится к текущему сеансу вопросов и ответов.