SQL считать строки с одинаковым значением в столбце и группы по идентификатору? - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть такая таблица:

id  | value
1   |   1
2   |   1
3   |   2
4   |   3

Интересно, можно ли посчитать строки с одинаковым значением и сгруппировать их по идентификатору, но каждый раз, когда код будет возвращать счет 1, если я сгруппирую ихпо идентификатору, а не по значению

желаемый вывод:

id  | count
1   |   2(there are 2 rows with value 1)
2   |   2
3   |   1
4   |   1

Ответы [ 5 ]

0 голосов
/ 22 февраля 2019

Если вы действительно хотите результаты, которые вы указали в своем вопросе, я предлагаю следующее:

declare @Orig table (ID int, val int)
insert into @Orig values    (1, 1),
                            (2, 1),
                            (3, 2),
                            (4, 3)
--select * from @Orig       --show example table
declare @Stat table (val int, cnt int)
insert into @Stat 
select val as ID, count(val) as count from @Orig group by val order by val asc
--select * from @Stat       --L. Ribo's query results from group/order query
select o.ID, s.cnt from @Orig o
inner join @Stat s on o.val = s.val

Результаты:

ID cnt
1   2
2   2
3   1
4   1

Соедините таблицу статистики с исходной таблицей.Конечно, возможно, есть какой-то элегантный способ сделать это без временных таблиц, но мне проще разобраться и понять, пошагово делая это.Это было сделано в SQL Server.Временные таблицы в других разновидностях SQL (например, MySQL) имеют другой синтаксис.

0 голосов
/ 22 февраля 2019

В версиях MySQL без оконных функций вы можете достичь желаемых результатов с помощью самостоятельного объединения на value, считая количество значений во второй таблице:

SELECT t1.id, COUNT(t2.value) AS cnt
FROM table1 t1
JOIN table1 t2 ON t2.value = t1.value
GROUP BY t1.id

Вывод:

id  cnt
1   2
2   2
3   1
4   1

Демонстрация на dbfiddle

0 голосов
/ 22 февраля 2019

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

SELECT value AS id, COUNT(value) AS count FROM table GROUP BY value ORDER BY value ASC;
0 голосов
/ 22 февраля 2019

Вам необходимо посчитать значение столбца value для каждого идентификатора:

select 
  t.id,
  (select count(*) from tablename where value = t.value) count
from tablename t 

См. demo или же:

select t.id, g.count
from tablename t inner join (
  select value, count(value) count
  from tablename 
  group by value
) g on g.value = t.value

См. Демоверсию

0 голосов
/ 22 февраля 2019

В MySQL 8+ вы бы использовали оконные функции:

select t.*, count(*) over (partition by value) as cnt
from t;
...