2

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

例如(SQL Server 2008R2)

示例数据

所以,我想知道有多少次的组合

PMI 100 
RT 100
VT 100

存在于我的表中,以及它使用了多少个 itemid;

这三个形成一个组,因为它们一起被分配给一个 itemid。相同的组合分配给 id 2527 和 2529,因此该组至少使用两次。(使用次数 = 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
4

3 回答 3

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
于 2013-06-10T12:16:27.170 回答
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
于 2013-06-10T12:28:52.803 回答
1

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

选择代码、pct、count(p.*)
从 [table] 作为 p
按代码分组,pct
于 2013-06-10T12:16:32.167 回答