Базовый отчет на основе данных

Для каждой страны выведите ее код и следующую информацию (в заданном порядке) о ее исполнителях: количество групп, количество исполнителей, не являющихся группами, общее количество исполнителей, процент групп, процент артистов, не являющихся группами. . Страны, в которых нет исполнителей, в выводе не отображаются. Форматировать проценты как десятичные числа с 0 десятичными знаками.

Формат данных:
Исполнители
- имя (строка)
- тип (человек или группа)
- страна (уникальный трехзначный код)

Страны
 – код (уникальный трехзначный код)
 – название (строка)


Пример: Художники

Name |  Type  | Country
-----------------------
John    Band     qwe
Doe     Band     qwe
Mary    Person   qwe
Anon    Person   asd

Страны

Code  |  Name
--------------
qwe      Russia
asd      New Zealand

Ожидаемый результат:

Code | # of bands | # of artists not in band | total # of artists | % of bands | % of artists not in bands 
-----------------------------------------------------------------------------------------------------------
qwe    2                1                            3                66             33
asd    0                1                            1                0              100

Я просто не понимаю, как отслеживать все, и, по сути, мне нравится сохранять их, чтобы я мог вывести их все сразу. Я думаю, что смог бы получить это, если бы это была только одна страна за раз, но если она содержит несколько стран, я немного растерялся.
Есть какие-нибудь ресурсы о том, как это сделать?
Спасибо.


person Anon Li    schedule 18.11.2018    source источник


Ответы (1)


Вы можете попробовать использовать агрегатную функцию условия в CTE, а затем выполнить расчет в основном запросе.

Схема (PostgreSQL v9.6)

CREATE TABLE Artists(
   Name VARCHAR(50),
   Type VARCHAR(50),
   Country VARCHAR(50)
);


INSERT INTO Artists VALUES ('John','Band','qwe');
INSERT INTO Artists VALUES ('Doe','Band','qwe');
INSERT INTO Artists VALUES ('Mary','Person','qwe');
INSERT INTO Artists VALUES ('Anon','Person','asd');

CREATE TABLE Countries(
   Code VARCHAR(50),
   Name VARCHAR(50)
);



INSERT INTO Countries VALUES ('qwe','Russia');
INSERT INTO Countries VALUES ('asd','New Zealand');

Запрос №1

WITH CTE AS (
 SELECT Code,
        COUNT(CASE WHEN Type ='Band' THEN 1 END) BandCnt,
        COUNT(CASE WHEN Type <> 'Band' THEN 1 END) NotBandCnt,
        COUNT(Country) CountryCnt
 FROM Artists a 
 join Countries c on a.Country = c.Code
 GROUP BY Code
)
SELECT Code,
       BandCnt "# of bands",
       NotBandCnt "# of artists not in band",
       CountryCnt "total # of artists",
       BandCnt * 100.0  / CountryCnt  "% of bands",
       notBandCnt * 100.0  / CountryCnt  "% of artists not in band" 
FROM CTE;

Результат

| code | # of bands | # of artists not in band | total # of artists | % of bands             | % of artists not in band |
| ---- | ---------- | ------------------------ | ------------------ | ---------------------- | ------------------------ |
| asd  | 0          | 1                        | 1                  | 0.00000000000000000000 | 100.0000000000000000     |
| qwe  | 2          | 1                        | 3                  | 66.6666666666666667    | 33.3333333333333333      |

Просмотр скрипта БД

person D-Shih    schedule 18.11.2018
comment
Как я могу настроить это, если есть более 3 стран, из-за CASE WHEN Country = 'qwe', или это будет работать для более чем 3 стран? Спасибо - person Anon Li; 18.11.2018
comment
Вы можете попробовать использовать IN вместо = db-fiddle.com/f/kTkxp6K4H5CxBjkVgGSXVG/2 - person D-Shih; 18.11.2018
comment
Это означает, что мне нужно будет заранее создать список стран, предполагая, что я не знаю, какие страны содержат данные? Спасибо - person Anon Li; 18.11.2018
comment
@AnonLi Хорошо, я вижу, я редактирую свой ответ db-fiddle.com/f/kTkxp6K4H5CxBjkVgGSXVG/3 - person D-Shih; 18.11.2018
comment
о, странно, ваш код, кажется, работает нормально в этом примере, но когда я сделал это в своей другой базе данных, счетчик для BAND просто отображает 0, хотя полосы есть. Однако, когда я удалил материал CASE WHEN и просто получил COUNT(TYPE='Band'), счетчик для Band больше не равен 0. Спасибо! - person Anon Li; 18.11.2018