2017-07-28 68 views
0

我有以下SQL表格顯示案例編號及其值,案例編號總是出現在一個組中的2個案例,我想要統計表中出現相同案例編號的組合數量。訂單可能不同,請參閱案例A和C,它們都應該算作相同的組合。SQL計數多個單元格作爲組合

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

這適用於任何情況下,任何數量的值。只有當案件具有相同數量的值並且每​​個案例都具有匹配時,它纔會遞增頻率計數,不管順序如何。

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] 

結果蒙山值按升序排序

Case \t Values \t frequency 
 
A \t 1956,1992,1997 \t 2 
 
B \t 2000,2001 \t 1 
 
D \t 2005,2008 \t 1 
 
E \t 1956,1992 \t 3

+0

謝謝。原來我的問題是數據會一直出現3次。你的查詢可以處理更復雜的聯繫。這解決了我的問題。 – paddywide

+0

我真的想旋轉表格,以便我可以輕鬆地使用「不同」來計數。有沒有辦法將數據更改爲4列?它會顯示案例,值1,值2,值3 – paddywide

+0

用示例數據和預期結果修改您的問題,稍後我會看到它。 – Horaciux

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

+0

issn't正確的結果,頻率的一個是9000,但是我的表的總排只有1500 – paddywide

+0

你能否在特殊情況下增加更多的數據樣本? – Horaciux

+0

如果你看看SQLFiddle的例子,我在你分享的表格中添加了更多的數據並且工作正常。需要知道可以打破這種邏輯的其他組合 – Horaciux

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

+0

這工作在一個棘手的方式。但它不適用於3個或更多的值作爲組合。無論如何,謝謝你解決我的問題。如果有3個或更多值作爲組合,你能解決嗎? – paddywide

+0

你說數據是成對出來的:「病例號總是出現在一個組中的2例,現在你說可以是一個更大的數字?這是一個固定的數字嗎?你可以添加更多的數據樣本? – Horaciux

相關問題