T-SQL получает все уникальные группы с их счетом использования
Как найти уникальные группы, присутствующие в моей таблице, и показать, как часто этот тип группы используется?
Например (SQL Server 2008R2)
Итак, я хотел бы узнать, сколько раз сочетание
PMI 100
RT 100
VT 100
присутствует в моей таблице и для сколько itemid он используется;
Эти три формируют группу, потому что вместе они назначены одному itemid. Одна и та же комбинация присваивается идентификаторам 2527 и 2529, поэтому эта группа используется как минимум дважды. (usecount = 2)
(и я хочу знать, что для всех типов групп, которые появляются)
- Весь набор данных довольно большой, около 5.000.000 записей, поэтому я бы хотел избежать использования курсора.
- Количество комбинаций кода /pct для каждого элемента варьируется от 1 до 6.
- Значения в поле "код" не известны заранее, в среднем их более десятка
Я попытался использовать pivot, но в конце концов застрял, и я также попробовал различные комбинации GROUP-BY и количества.
Какие-нибудь яркие идеи?
Пример вывода:
code pct groupid usagecount
PMI 100 1 234
RT 100 1 234
VT 100 1 234
CD 5 2 567
PMI 100 2 567
VT 100 2 567
PMI 100 3 123
PT 100 3 123
VT 100 3 123
RT 100 4 39
VT 100 4 39
etc
3 ответа
Просто используя простую группу:
SELECT
code
, pct
, COUNT(*)
FROM myTable
GROUP BY
code
, pct
Не слишком уверен, что это больше похоже на то, что вы ищете:
select
uniqueGrp
, count(*)
from (
select distinct
itemid
from myTable
) as I
cross apply (
select
cast(code as varchar(max)) + cast(pct as varchar(max)) + '_'
from myTable
where myTable.itemid = I.itemid
order by code, pct
for xml path('')
) as x(uniqueGrp)
group by uniqueGrp
Любой из них должен возвращать каждую комбинацию кода и процента с идентификатором группы для кода и общим числом экземпляров кода для него. Вы также можете использовать их для добавления количества экземпляров определенного комбинированного кода /pct для определения% вклада и т. Д.
select
distinct
t.code, t.pct, v.groupcol, v.vol
from
[tablename] t
inner join (select code, rank() over(order by count(*)) as groupcol,
count(*) as vol from [tablename] s
group by code) v on v.code=t.code
или же
select
t.code, t.pct, v.groupcol, v.vol
from
(select code, pct from [tablename] group by code, pct) t
inner join (select code, rank() over(order by count(*)) as groupcol,
count(*) as vol from [tablename] s
group by code) v on v.code=t.code
Я думаю, что группировки по коду и Pct должно быть достаточно. Смотрите следующее:
выберите код,pct,count(p.*) из [таблицы] как р группировать по коду, pct