я хочу подсчитать различные значения и сообщить об их появлении в SQL. Дело в том, что мне нужно подсчитать количество вхождений в разных столбцах, а затем сообщить для каждого столбца количество вхождений для каждого значения. Итак, скажем, у меня есть такие данные из таблицы под названием Result :
Тогда мой результат должен быть:
Я попытался использовать функцию COUNT с союзами, чтобы получить каждый результат по отдельности, и это работает. Но я хочу, чтобы результаты были в одной строке для каждого идентификатора. Кто-нибудь может мне с этим помочь ?
Это если идентификатор никогда не появляется в определенном столбце входных данных. Например, 1 и 2 никогда не появляются в столбце «CoachId», следовательно, 0.
Но значение всегда будет появляться хотя бы один раз, @rucquoy, если оно есть в таблице. В вашем наборе результатов PilotID
1
появляется один раз, но у вас есть количество 0
для него?
Откуда берутся Id
во втором столбце и какова связь между столбцами в первой таблице (с суффиксом Id
) и столбцами в таблице результатов?
Это моя ошибка, вопрос плохо структурирован. Скажем, мои входные данные представляют собой таблицу с идентификатором и тремя внешними ключами (OwnerId, PilotId, CoachId). Затем я хочу иметь для каждого отдельного значения этого внешнего ключа их вхождение в столбец. (Итак, для каждого значения FK у меня должно быть 3 подсчета: количество раз, когда оно появляется как OwnerId, количество раз, когда оно появляется как aPilotId, и количество раз, когда оно появляется как CoachId)
Я думаю, вы хотите развернуть столбцы в строки, а затем подсчитать вхождения каждого значения. Ты можешь сделать:
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
id | owner | pilot | coach -: | ----: | ----: | ----: 1 | 1 | 1 | 0 2 | 1 | 2 | 0 3 | 1 | 0 | 3
Да, кажется, это то, чего хочет ОП.
Ооооооооо, это мило. Потребовалось менее секунды для запуска таблицы с более чем 700 тыс. строк. Я даже не знал, что такое перекрестное применение, думаю, мне еще многому нужно научиться. Спасибо за ваш ответ, сэр!
То же самое с использованием основных команд 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
Я не понимаю значения
0
.