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
Другие вопросы по тегам