SQL подсчитывает различные значения, отображаемые в разных столбцах

я хочу подсчитать различные значения и сообщить об их появлении в SQL. Дело в том, что мне нужно подсчитать количество вхождений в разных столбцах, а затем сообщить для каждого столбца количество вхождений для каждого значения. Итак, скажем, у меня есть такие данные из таблицы под названием Result :

Идентификатор идентификатор владельца идентификатор пилота идентификатор тренера А 1 2 3 Б 2 2 3 С 3 1 3

Тогда мой результат должен быть:

Идентификатор Владелец Пилот Тренер 1 1 1 0 2 1 2 0 3 1 0 3

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

Я не понимаю значения 0.

Gordon Linoff 14.12.2020 18:18

Это если идентификатор никогда не появляется в определенном столбце входных данных. Например, 1 и 2 никогда не появляются в столбце «CoachId», следовательно, 0.

rucquoy 14.12.2020 18:20

Но значение всегда будет появляться хотя бы один раз, @rucquoy, если оно есть в таблице. В вашем наборе результатов PilotID1 появляется один раз, но у вас есть количество 0 для него?

Thom A 14.12.2020 18:21

Откуда берутся Id во втором столбце и какова связь между столбцами в первой таблице (с суффиксом Id) и столбцами в таблице результатов?

PandaCheLion 14.12.2020 18:21

Это моя ошибка, вопрос плохо структурирован. Скажем, мои входные данные представляют собой таблицу с идентификатором и тремя внешними ключами (OwnerId, PilotId, CoachId). Затем я хочу иметь для каждого отдельного значения этого внешнего ключа их вхождение в столбец. (Итак, для каждого значения FK у меня должно быть 3 подсчета: количество раз, когда оно появляется как OwnerId, количество раз, когда оно появляется как aPilotId, и количество раз, когда оно появляется как CoachId)

rucquoy 14.12.2020 18:26
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
129
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

select v.id,
    sum(case when v.col = 'owner' then 1 else 0 end) owner,
    sum(case when v.col = 'pilot' then 1 else 0 end) pilot,
    sum(case when v.col = 'coach' then 1 else 0 end) coach
from mytable t
cross apply (values (t.ownerid, 'owner'), (t.pilotid, 'pilot'), (t.coachid, 'coach')) as v(id, col)
group by v.id

Демо на DB Fiddle:

id | owner | pilot | coach
-: | ----: | ----: | ----:
 1 |     1 |     1 |     0
 2 |     1 |     2 |     0
 3 |     1 |     0 |     3

Да, кажется, это то, чего хочет ОП.

Gordon Linoff 14.12.2020 18:26

Ооооооооо, это мило. Потребовалось менее секунды для запуска таблицы с более чем 700 тыс. строк. Я даже не знал, что такое перекрестное применение, думаю, мне еще многому нужно научиться. Спасибо за ваш ответ, сэр!

rucquoy 14.12.2020 18:39

То же самое с использованием основных команд SQL. гарантированно работает на любой СУБД:

SELECT 
  ids.id, 
  SUM(CASE WHEN ro.ownerid = ids.id THEN 1 ELSE 0 END) AS Owner,
  SUM(CASE WHEN po.pilotid = ids.id THEN 1 ELSE 0 END) AS Pilot,
  SUM(CASE WHEN co.coachid = ids.id THEN 1 ELSE 0 END) AS Coach
FROM (
  SELECT ownerID AS id FROM result UNION
  SELECT pilotID FROM result UNION
  SELECT coachID FROM result  
) ids
  LEFT JOIN result ro ON ids.id = ro.ownerid
  LEFT JOIN result po ON ids.id = po.pilotid
  LEFT JOIN result co ON ids.id = co.coachid
GROUP BY ids.id

Здесь, в SQLFiddler

Другие вопросы по теме