2016-10-05 6 views
0

Ich habe eine Tabelle wieWie unterschiedliche Kombination von Gruppen

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

erhalte ich die eindeutige Kombination aus disease_id über die gesamte Tabelle finden müssen. Ich kann nicht nach name_id gruppieren, da dies nicht eindeutige Kombinationen ergeben würde (siehe name_id 1 und 4). Ich kann GROUP BY nicht weglassen, das würde eine einfache Liste von disease_id über alle name_id ergeben.

Was ich will, beantworten können, ist eine Frage wie: Was die unterschiedlichen Kombinationen von Kinderkrankheiten sind, die innerhalb einer Population aufgetreten ist (und später vielleicht das Hinzufügen einer Zählung:

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

nach meinem Verständnis in der Tabelle angegeben sind alle verschiedenen Kombinationen, rechts ..und auch Ihre Anforderung nicht die klar hier zu wissen, wie Frage zu verbessern: https: //spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ – TheGameiswar

+1

Würden Sie uns bitte auch die gewünschte Ausgabe zeigen? Dein Problem ist zumindest für mich nicht klar genug! –

+0

Name_id 1 und 4 haben gleiche Krankheit_ID (1,2).Name_id 2 und 5 haben dieselbe disease_id (2) – user2378895

Antwort

0

Lösung hat zwei Schritte.

  1. Aufzählung Satz von Krankheiten, an denen jeder Patient leidet; Speichern Sie es in einer separaten Tabelle
  2. Verwenden Sie die obige Tabelle, um verschiedene Kombination von Krankheiten sowie die Anzahl der Patienten mit diesen Kombinationen aufzulisten.

nun für den Schritt # 1 benötigen Sie eine gespeicherte Prozedur, die als untergeht:

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 

Die gespeicherte Prozedur eine Tabelle produzieren oben, die wie

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

aussehen Für Schritt # 2 ist die Abfrage wie folgt:

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

W hich erzeugt eine Ausgabe wie unter:

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

Soll die gespeicherte Prozedur Tabelle 'diseasecombi' erstellen? – user2378895

+0

Tabelle 'diseasecombi' hat zwei Spalten: name_id (int) und leidet (varchar (MAX)). Die Tabelle wird nur von der gespeicherten Prozedur verwendet, die vor der Ausführung der gespeicherten Prozedur existiert. – Rupesh

0

Sie sein wollen Lage, eine Frage zu beantworten wie „Was die unterschiedlichen Kombinationen von Kinderkrankheiten sind, die innerhalb einer Population aufgetreten“

ist meine Antwort auf folgende Annahmen zugrunde:.

  1. disease_id bezieht sich auf Windpocken, Masern, Mumps usw.
  2. name_id bezieht sich auf den Patienten
  3. disease_id 1 bezieht sich auf "Windpocken" und disease_id 3 bezieht sich auf "Masern"; und beide werden als Kinderkrankheiten betrachtet. (Dies ist nur zum Beispiel, können Sie anders sein)

Basierend auf obige Annahme Abfrage erzeugt unter dem gewünschten Ergebnis:

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 

Ergebnis wie unter sein:

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

Das ist die richtige Idee. Wie sind Sie auf die verschiedenen Kombinationen gekommen? Mit Blick auf die Daten, oder? Stellen Sie sich vor, es gibt Millionen von Zeilen. Wie würden Sie die verschiedenen Kombinationen in diesem Fall finden? Ich brauche die Abfrage, um sie zu finden. – user2378895

+0

@ user2378895, Wie viele Krankheiten (nicht Kombinationen, sondern nur Krankheit) haben Sie? Und wie entscheiden Sie zum Beispiel, welche Krankheiten als "Kinderkrankheiten" und Krankheiten für eine andere Gruppe gelten? – Rupesh

Verwandte Themen