Запросить количество уникальных результатов в столбце A, но затем разделить их по значениям в столбце B - PullRequest
0 голосов
/ 30 октября 2019

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

Если таблица I 'm получение данных выглядит примерно так:

id  | Team | Period |
____________________
1   | A    |   1    |
2   | B    |   1    |
3   | B    |   1    |
4   | A    |   1    |
5   | E    |   2    |
6   | D    |   3    |
7   | A    |   3    |
8   | A    |   3    |
9   | B    |   4    |
10  | A    |   4    |
11  | C    |   4    |

etc...

Я хочу получить список того, сколько раз каждая команда появляется за период, например, так.

team  | period | count  |
_________________________
  A   |   1    |   2    |
  B   |   1    |   2    |
  C   |   1    |   0    |
  D   |   1    |   0    |
  E   |   1    |   0    |
  A   |   2    |   0    |
  B   |   2    |   0    |
  C   |   2    |   0    |
  D   |   2    |   0    |
  E   |   2    |   0    |
  A   |   3    |   2    |

Это будет использоваться встраницу PHP, чтобы затем создать массив ассоциаций и распечатать данные для целей отчетности.

Я ранее использовал такие вещи, как

SELECT sum(case when somecolumn = 'blah' then 1 else 0 end) as blah_count 

Но я не могу сделать это здесь, потому что вВ будущем имена команд могут измениться на неизвестное в настоящее время значение, поэтому я не могу использовать имена в запросе. (и нет, мне не скажут об этом, чтобы я мог изменить запрос.) Поэтому мне нужен запрос, в котором он и подсчитывает количество вхождений в столбце команды, и разбивает их по периодам. Период всегда будет числом от 1 до 13.

Ответы [ 3 ]

0 голосов
/ 30 октября 2019
SELECT team,period,count(*) as count
from TABLENAME group by team

enter image description here

0 голосов
/ 30 октября 2019

Почему бы не повернуть периоды?

select team,
       sum( period = 1 ) as period_1,
       sum( period = 2 ) as period_2,
       sum( period = 3 ) as period_3,
       sum( period = 4 ) as period_4
from t
group by team;

Кажется, вы знаете, что существует четыре периода.

0 голосов
/ 30 октября 2019

Вы можете cross join все различные значения team с и period с, а затем left join исходная таблица и агрегат.

select
    te.team,
    pe.period,
    count(ta.team) cnt
from 
    (select distinct team from mytable) te
    cross join (select distinct period from mytable) pe
    left join mytable ta 
        on ta.team = te.team
        and ta.period = pe.period
group by te.team, pe.period
order by pe.period, te.team

Демонстрация включенаDB Fiddle :

team | period | cnt
:--- | -----: | --:
A    |      1 |   2
B    |      1 |   2
C    |      1 |   0
D    |      1 |   0
E    |      1 |   0
A    |      2 |   0
B    |      2 |   0
C    |      2 |   0
D    |      2 |   0
E    |      2 |   1
A    |      3 |   2
B    |      3 |   0
C    |      3 |   0
D    |      3 |   1
E    |      3 |   0
A    |      4 |   1
B    |      4 |   1
C    |      4 |   1
D    |      4 |   0
E    |      4 |   0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...