Базовый отчет на основе данных - PullRequest
0 голосов
/ 18 ноября 2018

Для каждой страны выведите ее код и следующую информацию (в указанном порядке) о своих исполнителях: количество групп, количество артистов, которые не являются группами, общее количество артистов, процент групп, процент артистов, которые не являются группами. Страны без художников не отображаются в выводе. Отформатируйте проценты как десятичные числа с 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

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

1 Ответ

0 голосов
/ 18 ноября 2018

Можно попытаться использовать агрегатную функцию условия в 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      |

Просмотр на БД Fiddle

...