我有以下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个案例组合怎么办?
答案 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
答案 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
答案 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值按升序排序
Case Values frequency
A 1956,1992,1997 2
B 2000,2001 1
D 2005,2008 1
E 1956,1992 3
&#13;