Eine Möglichkeit, Patienten durch die Sätze von Paaren übereinstimmen (therapeutic_class, generic_name)
ist es, die durch Kommata getrennte Strings in der gewünschten Ausgabe und zur Gruppe von ihnen und zählen zu erstellen. Um dies richtig zu machen, müssen Sie die Paare identifizieren. Siehe meinen Kommentar unter der ursprünglichen Frage und meine Kommentare zu Gordons Antwort, um einige der Probleme zu verstehen.
Ich mache diese Identifizierung in einigen Vorarbeiten in der Lösung unten. Wie ich in meinem Kommentar erwähnt habe, wäre es besser, wenn die Paare und eindeutigen IDs bereits in Ihrem Datenmodell vorhanden wären; Ich erstelle sie im laufenden Betrieb.
Wichtiger Hinweis: Dies setzt voraus, dass die durch Kommas getrennten Listen nicht zu lang werden. Wenn Sie 4000 Zeichen (oder ca. 32000 Zeichen in Oracle 12, mit bestimmten Optionen eingeschaltet), können Sie die Zeichenfolgen in CLOBs aggregieren, aber Sie können nicht GROUP BY
CLOBs (in der Regel nicht nur in diesem Fall), also dies Ansatz wird fehlschlagen. Ein robusterer Ansatz besteht darin, die Paare von Paaren zu vergleichen, nicht irgendeine Ansammlung von ihnen. Die Lösung ist komplizierter, ich werde es nur behandeln, wenn es für Ihr Problem benötigt wird.
with
-- Begin simulated data (not part of the solution)
test_data (id, therapeutic_class, generic_name) as (
select 1, 'GY6', 'insulin' from dual union all
select 1, 'MH4', 'maleate' from dual union all
select 1, 'KJ*', 'glargine' from dual union all
select 2, 'GY6', 'supplies' from dual union all
select 2, 'C4C', 'diaoxy' from dual union all
select 3, 'GY6', 'insulin' from dual union all
select 3, 'MH4', 'maleate' from dual union all
select 3, 'KJ*', 'glargine' from dual
),
-- End of simulated data (for testing purposes only).
-- SQL query solution continues BELOW THIS LINE
valid_pairs (pair_id, therapeutic_class, generic_name) as (
select rownum, therapeutic_class, generic_name
from (
select distinct therapeutic_class, generic_name
from test_data
)
),
first_agg (id, tc_list, gn_list) as (
select t.id,
listagg(p.therapeutic_class, ',') within group (order by p.pair_id),
listagg(p.generic_name , ',') within group (order by p.pair_id)
from test_data t join valid_pairs p
on t.therapeutic_class = p.therapeutic_class
and t.generic_name = p.generic_name
group by t.id
)
select count(*) as cnt, tc_list, gn_list
from first_agg
group by tc_list, gn_list
;
Ausgang:
CNT TC_LIST GN_LIST
--- ------------------ ------------------------------
1 GY6,C4C supplies,diaoxy
2 GY6,KJ*,MH4 insulin,glargine,maleate
Sie sind für 'listagg suchen()' –
[Nicht Beispieldaten als Screenshots post] (http://meta.stackoverflow.com/questions/ 285551/why-may-ich-nicht-upload-images-of-code-auf-so-wenn-eine-frage/285557 # 285557) Benutze formatierten Text - wie du es am Anfang getan hast. –
Das Datenmodell ist nicht ganz richtig. Sie können separate Tabellen für therapeutische Klassen und für generische Namen haben (wenn Sie das nicht tun, sollten Sie), aber ein weiteres Stück fehlt. Vermutlich kann nicht jeder generische Name mit jeder therapeutischen Klasse assoziiert werden; Nur einige Paare sind gültig, während andere ungültig sind. Dies sollte in einer separaten Viele-zu-Viele-Zuordnungstabelle erfolgen, wobei jedem gültigen Paar eine eindeutige Kennung zugewiesen wird. Dann sollte Ihr Tisch mit Patienten und Paaren (therapeutische Klasse, generischer Name) stattdessen Patienten und eindeutige IDs solcher gültiger Paare haben. Dies würde auch die Abfrage vereinfachen. – mathguy