解決方案有兩個步驟。
- 列舉每個患者患病的一組疾病;將其存儲在單獨的表中
- 使用上表列出疾病的不同組合以及患有這些組合的患者數。
現在,對於步驟#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
按我的理解,在表中提供的所有是不同的組合,右..和還您的要求不clear.please看這裏瞭解如何改進的問題:HTTPS: //spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ – TheGameiswar
您是否也請向我們展示期望的輸出?至少你的問題對我來說還不夠清楚! –
Name_id 1和4具有相同的disease_id(1,2)。Name_id 2和5有相同的disease_id(2) – user2378895