SQL将多个单元格计为组合

时间:2017-07-28 00:28:36

标签: sql

我有以下SQL表显示案例编号及其值,案例编号总是出现在一组中的2个案例中,我想计算表中出现的具有相同案例编号的组合数量。如果订单可能不同,请参见案例A和C,两者都应算作相同的组合。

case  value

A     1992

A     1956

B     2000

B     2001

C     1956

C     1992

目标是获取每个组合的总数,因此输出格式并不重要。预期结果之一:

Seq  value   frequency

1    1992    2

1    1956    2

2    2000    1

2    2001    1

如果有3个案例组合怎么办?

3 个答案:

答案 0 :(得分:0)

数据样本,SQL Server 2014

CREATE TABLE Table1
    ([case] varchar(1), [value] int)
;

INSERT INTO Table1
    ([case], [value])
VALUES
    ('A', 1992),
    ('A', 1956),
    ('B', 2000),
    ('B', 2001),
    ('C', 1956),
    ('C', 1992)
;

查询

select dense_rank() over (ORDER BY min(a.[case])) seq,  a.value, count(*) freq 
from table1 a left join table1 b
    on a.value=b.value and a.[case]<>b.[case]
group by a.value 
order by a.value

http://sqlfiddle.com/#!6/40a87/3

答案 1 :(得分:0)

这与您发布预期结果的方式不完全相同,但会回复您之前评论中的要求。

select min, max,  count (*) freq
from (
  select a.[case] [case], min(a.value) min, max(a.value) max
  from table1 a      
  group by a.[case]) b
 group by min, max
 order by min, max

http://sqlfiddle.com/#!6/40a87/18

答案 2 :(得分:0)

对于任何情况,这适用于任意数量的值。只有当案例具有相同数量的值并且每​​个值都匹配时,它才会增加频率计数,无论顺序如何。

CREATE TABLE #Table1
    ([Case] varchar(1), [Value] int)
;

INSERT INTO #Table1
    ([Case], [Value])
VALUES
    ('A', 1992),    ('A', 1956),    ('A', 1997),    ('B', 2000),    ('B', 2001),    ('C', 1956),
    ('C', 1992),     ('C', 1997),   /*('C',1993),*/    ('D', 2005),    ('D', 2008),    ('E', 1956),
    ('E', 1992) ,    ('F', 1956),    ('F', 1992),        ('G', 1956),    ('G', 1992)  ;

--Query
select min(a.[Case]) [Case], [Values], count(*) frequency
from (
    SELECT  t.[Case],
             stuff(
                    (
                        select  ',' + cast (t1.[Value] as varchar(20))
                        from    #table1 t1
                        where   t1.[Case] = t.[Case]
                        order by t1.[Value] 
                        for xml path('')
                    ),1,1,'') [Values]
    FROM    #table1 t
    GROUP BY t.[Case]
    )a
group by [Values]
order by [Case]

结果whith值按升序排序

&#13;
&#13;
Case	Values	frequency
A	1956,1992,1997	2
B	2000,2001	1
D	2005,2008	1
E	1956,1992	3
&#13;
&#13;
&#13;