2016-10-05 82 views
0

的不同組合,我有一個表像如何獲得團體

name_id  disease_id 
-------  ----------  
1   1  
1   2  
2   2  
3   1  
3   3  
4   1  
4   2  
5   2  

我需要找到disease_id的整個表的不同組合。我無法按name_id進行分組,因爲這會產生不明顯的組合(請參閱name_id 1和4)。我不能忽略GROUP BY,它會在所有name_id中生成一個簡單的disease_id列表。

我希望能夠給的答覆是這樣的問題:什麼是羣體內發生的(以及後來也許增加一個計數兒童疾病的獨特組合:

Chickenpox   (10) 
Chickenpox+Measles (2) 
Measles    (5) 
Measles+Mumps  (1) 
etc. 
+1

按我的理解,在表中提供的所有是不同的組合,右..和還您的要求不clear.please看這裏瞭解如何改進的問題:HTTPS: //spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ – TheGameiswar

+1

您是否也請向我們展示期望的輸出?至少你的問題對我來說還不夠清楚! –

+0

Name_id 1和4具有相同的disease_id(1,2)。Name_id 2和5有相同的disease_id(2) – user2378895

回答

0

解決方案有兩個步驟。

  1. 列舉每個患者患病的一組疾病;將其存儲在單獨的表中
  2. 使用上表列出疾病的不同組合以及患有這些組合的患者數。

現在,對於步驟#1你需要一個存儲過程,而云爲下:

DECLARE @prv int 
DECLARE @nid int 
DECLARE @dname varchar(100) 
DECLARE @combi varchar(500) 

DECLARE c1 CURSOR FOR 
SELECT name_id, disease_name 
FROM patients 
JOIN diseases ON patients.disease_id = diseases.disease_id 
ORDER BY name_id, disease_name; 

DELETE FROM diseasecombi; 

OPEN c1 
FETCH NEXT FROM c1 INTO @nid, @dname 
SET @prv = @nid 
SET @combi = '' 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    IF @prv <> @nid 
    BEGIN 
     INSERT INTO diseasecombi (name_id, suffers) VALUES (@prv, @combi) 
     SET @prv = @nid 
     SET @combi = '' 
    END 
    IF LEN(@combi) > 0 SET @combi = @combi + ', ' 
    SET @combi = @combi + @dname 
    FETCH NEXT FROM c1 INTO @nid, @dname 
END 
INSERT INTO diseasecombi(name_id, suffers) VALUES (@prv, @combi) 

CLOSE c1 
DEALLOCATE c1 

的存儲過程上面會產生一個表,看起來像

name_id suffers 
------- ------------------------------- 
1  Chickenpox, Mumps 
2  Chickenpox, Fibroids, Measles 
3  Chickenpox, Mumps 
4  Chickenpox, Measles 
5  Chickenpox, Measles 
6  Chickenpox 
7  Rashes 

對於步驟#2,查詢如下:

SELECT suffers, COUNT(*) AS Patients 
FROM diseasecombi 
GROUP BY suffers 
ORDER BY suffers 

W HICH產生輸出下:

Diseases      Patients 
------------------------------ ---------- 
Chickenpox      1 
Chickenpox, Fibroids, Measles 1 
Chickenpox, Measles    2 
Chickenpox, Mumps    2 
Rashes       1 
+0

存儲過程是否應該創建表'diseasecombi'? – user2378895

+0

表'diseasecombi'有兩列:name_id(int)和suffers(varchar(MAX))。該表僅由存儲過程使用,應該在存儲過程執行之前存在。 – Rupesh

0

你想成爲能夠回答諸如「什麼是羣體內發生的兒童疾病的獨特組合」問題

我的答案是基於以下假設:

  1. 疾病_id指水痘,麻疹,腮腺炎等
  2. name_id指患者
  3. 疾病_id 1指'水痘'和疾病_id 3指'麻疹';兩者都被視爲兒童疾病。 (這僅僅是舉例來說,你可以不同)

基於上述假設,查詢下面產生所需的結果:

SELECT 'Chickenpox' as 'DiseaseName', COUNT(*) as 'Patients' 
FROM (
    SELECT name_id FROM table GROUP BY name_id HAVING COUNT(*) = 1 WHERE disease_id = 1 
    ) d1 
UNION 
SELECT 'Measles' as 'DiseaseName', COUNT(*) as 'Patients' 
FROM (
    SELECT name_id FROM table GROUP BY name_id HAVING COUNT(*) = 1 WHERE disease_id = 3 
    ) d3 
UNION 
SELECT 'Chickenpox + Measles' as 'DiseaseName', COUNT(*) as 'Patients' 
FROM (
    SELECT name_id FROM table GROUP BY name_id HAVING COUNT(*) = 2 WHERE disease_id IN (1,3) 
    ) d1d3 

結果將被作爲下:

DiseaseName   Patients 
-------------------- --------- 
Chickenpox   10 
Measles    5 
Chickenpox+Measels 2 
+0

這是正確的想法。你是怎麼想出不同的組合的?通過查看數據,對吧?想象一下有數百萬行。你會如何在這種情況下找到不同的組合?我需要查詢來查找它們。 – user2378895

+0

@ user2378895,你有多少種疾病(不是組合,而只是疾病)?例如,你如何確定哪些疾病被認爲是「兒童疾病」,以及是否爲另一個羣體的疾病等等? – Rupesh