T-SQL使用其使用计数获取所有唯一组

时间:2013-06-10 12:10:50

标签: sql-server tsql count grouping

如何查找表格中存在的唯一组,并显示该类型组的使用频率?

例如(SQL Server 2008R2)

Example Data

所以,我想找出

组合多少次
PMI 100 
RT 100
VT 100

出现在我的表格中,以及使用了多少个itemid;

这三个组成一个组,因为它们一起被分配到一个itemid。相同的组合分配给id 2527和2529,因此该组至少使用两次。 (usagecount = 2)

(我想知道出现的所有类型的群组)

  • 整个数据集非常大,大约有5.000.000条记录,所以我想避免使用光标。
  • 每个itemid的代码/ pct组合数在1到6之间。
  • “代码”字段中的值预先不知道,平均有十几个值

我尝试使用数据透视表,但我最终陷入困境,我也尝试了各种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 个答案:

答案 0 :(得分:2)

只使用一个简单的小组:

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

答案 1 :(得分:2)

其中任何一个都应该返回代码和百分比的每个组合,代码的组ID和代码的实例总数。您也可以使用它们来添加特定代码/ 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

答案 2 :(得分:1)

按代码分组,我认为Pct应该足够了。请参阅以下内容:

select code,pct,count(p.*)
from [table] as p
group by code,pct