Как я исправлю эту таблицу с помощью MySQL?

#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 не относится к текущему сеансу вопросов и ответов.