FORUM PER UTENTI MILLEWIN
Attenzione !
Per intervenire sul forum è necessario essere registrati e connessi.

L'Amministratore

****************************************************
“Se tu hai una mela ed io ho una mela, e ce la scambiamo, alla fine tu ed io avremo sempre una mela ciascuno.
Ma se tu hai un’idea ed io ho un’idea, e ce la scambiamo, allora avremo entrambi due idee”.

George Bernard Shaw
****************************************************

doppia aggregazione e frequenza

Pagina 2 di 2 Precedente  1, 2

Andare in basso

Re: doppia aggregazione e frequenza

Messaggio  GiampiMaz il Gio 6 Feb 2014 - 11:11

In realtà non abbiamo considerato tutti gli antiaggreganti ma solo acido acetilsalicilico e clopidogrel singoli, inoltre manca ad esempio l'associazione clopidogrel-aspirina (tipo duoplavin) o l'aspirina associata al protettore gastrico, quindi la query andrebbe resa più sensibile.
Francamente mi ero concentrato su quella faccenda del zero pazienti che mi ha fatto tribolare (ma uno che ha un'angoplastica non ha anche codificata una cardiopatia?!).
Sarebbe utile che Nanci segnalasse quali antiaggreganti usano i pazienti non estratti e la data dell'ultima prescrizione.

Poi magari, a parte, affronterei il suo problema con le tabelle.
giampiero
GiampiMaz
GiampiMaz
Membro Junior
Membro Junior

Messaggi : 122
Punti : 3116
Voti per importanza dei messaggi : 33
Data d'iscrizione : 20.02.11

Visualizza il profilo

Torna in alto Andare in basso

DOPPIA AGGREGAZIONE

Messaggio  nanci giacinto il Sab 8 Feb 2014 - 20:00

Caro Giampi la tua ultima query funziona benissimo e  da lo stesso risultato di quella di Admin. I pz con angioplastica non estratti dalle query hanno queste prescrizioni. PRIMO PZ) efient (B01AC22) 02/08/2013 E CARDIOASPIRINA 21/10/2013 POI SOSTITUITI CON DUOPLAVIN A DICEMBRE 2013; SECONDO PZ) cardioaspirina 11/12/2103 e dilatrend 30 11/12/2013, TERZO PZ) cardioaspirina 11/12/2013 e seloken 10/10/2013. TUTTI E TRE HANNO CODIFICATO OLTRE ALL'ANGIOPLASTICA L'INFARTO DEL MIOCARDIO E LA CARDIOPATIA ISCHEMICA. Grazie ancora (ad entrambi) per le query. Ribadisco la supplichevole richiesta a chi di voi conosce un manuale, anche minimo, del linguaggio sql per le tabelle di dare indicazione per reperirlo.
nanci giacinto
nanci giacinto
Membro Junior
Membro Junior

Messaggi : 126
Punti : 3134
Voti per importanza dei messaggi : -1
Data d'iscrizione : 02.03.11

Visualizza il profilo

Torna in alto Andare in basso

Re: doppia aggregazione e frequenza

Messaggio  GiampiMaz il Sab 8 Feb 2014 - 21:28

Ciao Nanci,
è come dicevo sopra, il primo paziente faceva in un primo tempo un antiaggregante non acetilsalicilico/clopidogrel e ora fa l'associazione in una forma che la query non cerca. Gli altri due non fanno una doppia antiaggregazione (usano come antiaggregante solo cardioaspirin) e quindi non dovevano essere estratti.
Se vuoi aggiungere altre forme di doppia antiaggregazione occorre aggiungerle alla query, se vuoi che vengano estratti tutti i pazienti con angioplastica e cardiopatia che fanno anche un solo antiaggregante (o magari terapia anticoagulante) si può modificarla.

Conto di darti domani un'indicazione sulle tabelle, ma ho paura che non sia come te lo aspetti.
giampiero
GiampiMaz
GiampiMaz
Membro Junior
Membro Junior

Messaggi : 122
Punti : 3116
Voti per importanza dei messaggi : 33
Data d'iscrizione : 20.02.11

Visualizza il profilo

Torna in alto Andare in basso

Re: doppia aggregazione e frequenza

Messaggio  nanci giacinto il Gio 13 Feb 2014 - 14:13

Salve come mai questa query fatta da Admin estrae tutto tranne i codici ICD9? La query,simile a questa, fatta da Giampi indica soltanto con un (si o con un no) se c'è la cardiopatia e/o l'angioplastica, ma non da il codice ICD9. Inoltre ho aggiunto altri antiaggreganti oltre alla cardioaspirina e al clopidrogel. Sono inseriti in modo corretto? grazie saluti

select distinct p.cognome, p.nome, days(p.nascita, today())/365 eta, p.sesso sesso,
(select list (distinct x.co_des) from cart_terap x where p.codice=x.codice and x.co_atc like 'C07%' and x.data_open > today() - 365) AS beta_bloc, 
(select pa.frequenza from cart_press pa where p.codice=pa.codice and 
pa.frequenza Is Not Null And Not Exists (Select a1.codice From cart_press a1
Where pa.codice = a1.codice  And (a1.data_open > pa.data_open
Or (a1.data_open = pa.data_open And a1.rowid>pa.rowid)) And a1.frequenza is Not Null) ) AS Frequenza,
(select distinct max(z.co_des) from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC04' ) Clopidogrel,
(select distinct max(z.co_des) from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC06' ) Ac_Acetilsalicilico,



(select distinct max(z.co_des) from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC22' ) Prasugel,


(select distinct max(z.co_des) from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC24' ) Brilique,


(select distinct max(z.co_des) from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC11' ) Ventavis,


(select distinct max(z.co_des) from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC30' ) Ticaglerol


from pazienti p, nos_002 n
where p.codice=n.codice
and p.codice IN (select x.codice from cart_pazpbl x where p.codice=x.codice and (x.cp_code like '41[01234]%' OR x.cp_code like 'v45.82' ))
and p.codice IN (select z.codice from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC04' and z.data_open between today() - 180 and today())
and p.codice IN (select z.codice from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC06'  and z.data_open between today() - 180 and today())
AND (n.pa_drevoca IS NULL or n.pa_drevoca >TODAY()) AND (p.decesso IS NULL)
AND p.pa_convenzione='S'
AND n.pa_medi like '%'
order by 1,2
nanci giacinto
nanci giacinto
Membro Junior
Membro Junior

Messaggi : 126
Punti : 3134
Voti per importanza dei messaggi : -1
Data d'iscrizione : 02.03.11

Visualizza il profilo

Torna in alto Andare in basso

Re: doppia aggregazione e frequenza

Messaggio  Admin il Gio 13 Feb 2014 - 21:08

Tutte le colonne che si vogliono evidenziare devono essere specificate tra Select e FROM:

select distinct p.cognome, p.nome, days(p.nascita, today())/365 eta, p.sesso sesso,
(Select LIST(cp_code) FROM cart_pazpbl pb WHERE p.codice=pb.codice and (pb.cp_code like '41[01234]%' OR pb.cp_code like 'v45.82') ) ICD9,
(select list (distinct x.co_des) from cart_terap x where p.codice=x.codice and x.co_atc like 'C07%' and x.data_open > today() - 365) AS beta_bloc,
(select pa.frequenza from cart_press pa where p.codice=pa.codice and
pa.frequenza Is Not Null And Not Exists (Select a1.codice From cart_press a1
Where pa.codice = a1.codice  And (a1.data_open > pa.data_open
Or (a1.data_open = pa.data_open And a1.rowid>pa.rowid)) And a1.frequenza is Not Null) ) AS Frequenza,
(select distinct max(z.co_des) from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC04' ) Clopidogrel,
(select distinct max(z.co_des) from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC06' ) Ac_Acetilsalicilico,

(select distinct max(z.co_des) from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC22' ) Prasugrel,
(select distinct max(z.co_des) from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC24' ) Brilique,
(select distinct max(z.co_des) from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC11' ) Ventavis,
(select distinct max(z.co_des) from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC30' ) Aggrenox_Duoplavin
from pazienti p, nos_002 n
where p.codice=n.codice
and p.codice IN (select x.codice from cart_pazpbl x where p.codice=x.codice and (x.cp_code like '41[01234]%' OR x.cp_code like 'v45.82' ))
and p.codice IN (select z.codice from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC04' and z.data_open between today() - 180 and today())
and p.codice IN (select z.codice from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC06'  and z.data_open between today() - 180 and today())
AND (n.pa_drevoca IS NULL or n.pa_drevoca >TODAY()) AND (p.decesso IS NULL)
AND p.pa_convenzione='S'
AND n.pa_medi like '%'
order by 1,2

_________________
L'Amministratore
Giuseppe Blasio
Admin
Admin
Admin
Admin

Messaggi : 525
Punti : 3605
Voti per importanza dei messaggi : 85
Data d'iscrizione : 20.02.11
Località : CASERTA

Visualizza il profilo http://utentimillewin.forumattivo.it

Torna in alto Andare in basso

Re: doppia aggregazione e frequenza

Messaggio  GiampiMaz il Gio 13 Feb 2014 - 21:42

Nanci, ciao, ma credo che tu non ti sia spiegato o che confonda un poco le cose.
La struttura delle query è:

SELECT (cioè SELEZIONA) tutte le cose che vogliamo (e dove hai messo i codici degli antiaggreganti)
FROM (cioè DA) le tabelle o viste che ci servono
WHERE (cioè OVE) le condizioni che poniamo per estrarre i dati

se tu metti le varie categorie di antiaggreganti dopo SELECT ti estrarrà il loro codice ma sempre solo se sono soddisfatte le condizioni di WHERE.
in WHERE le condizioni dicono ancora di estrarre SOLO i pazienti con cardiopatia o  (OR) angioplastica che fanno contemporaneamente (AND) sia clopidogrel che aspirina. Le altre combinazioni di antiaggreganti sono escluse.

Se vuoi estrarre ANCHE i pazienti che fanno ad es 'B01AC30'  Aggrenox_Duoplavin devi mettere questa condizione in WHERE, giocando con AND OR e parentesi varie in modo da coprire le varie possibilità. (naturalmente puoi lasciare dopo select tutti i codici da visualizzare). Prova, magari indicando quali combinazioni di antiaggreganti intendi testare poi vediamo.
giampiero
GiampiMaz
GiampiMaz
Membro Junior
Membro Junior

Messaggi : 122
Punti : 3116
Voti per importanza dei messaggi : 33
Data d'iscrizione : 20.02.11

Visualizza il profilo

Torna in alto Andare in basso

doppia aggregazione

Messaggio  nanci giacinto il Dom 16 Feb 2014 - 23:16

Caro Giampi grazie per la spiegazione molto esauriente. Ho fatto come hai suggerito ma la query si blocca, gira, gira... e non da nessun risultato e sono curioso e ansioso di sapere perché ciò avviene e sono sicuro che imparerò ancora qualcosa.Comunque la mia domanda originaria era ed è perché sia la tua query che quella di Admin estraggono  i pz con cardiopatie e/o angioplastica ma non registrano per ogni paziente il tipo di patologia (ICD9). grazie 


select distinct p.cognome, p.nome, days(p.nascita, today())/365 eta, p.sesso sesso,
(select list (distinct x.co_des) from cart_terap x where p.codice=x.codice and x.co_atc like 'C07%' and x.data_open > today() - 365) AS beta_bloc, 
(select pa.frequenza from cart_press pa where p.codice=pa.codice and 
pa.frequenza Is Not Null And Not Exists (Select a1.codice From cart_press a1
Where pa.codice = a1.codice  And (a1.data_open > pa.data_open
Or (a1.data_open = pa.data_open And a1.rowid>pa.rowid)) And a1.frequenza is Not Null) ) AS Frequenza,
(select distinct max(z.co_des) from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC04' ) Clopidogrel,
(select distinct max(z.co_des) from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC06' ) Ac_Acetilsalicilico,
(select distinct max(z.co_des) from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC22' ) Prasugel,
(select distinct max(z.co_des) from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC24' ) Brilique,
(select distinct max(z.co_des) from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC11' ) Ventavis,
(select distinct max(z.co_des) from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC30' ) Ticaglerol
from pazienti p, nos_002 n
where p.codice=n.codice
and p.codice IN (select x.codice from cart_pazpbl x where p.codice=x.codice and (x.cp_code like '41[01234]%' OR x.cp_code like 'v45.82' ))
and p.codice IN (select z.codice from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC04' and z.data_open between today() - 180 and today())
or p.codice IN (select z.codice from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC06'  and z.data_open between today() - 180 and today())
or p.codice IN (select z.codice from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC22'  and z.data_open between today() - 180 and today())
or p.codice IN (select z.codice from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC24'  and z.data_open between today() - 180 and today())
or p.codice IN (select z.codice from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC11'  and z.data_open between today() - 180 and today())
or p.codice IN (select z.codice from  cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC30'  and z.data_open between today() - 180 and today())
AND (n.pa_drevoca IS NULL or n.pa_drevoca >TODAY()) AND (p.decesso IS NULL)
AND p.pa_convenzione='S'
AND n.pa_medi like '%'
order by 1,2
nanci giacinto
nanci giacinto
Membro Junior
Membro Junior

Messaggi : 126
Punti : 3134
Voti per importanza dei messaggi : -1
Data d'iscrizione : 02.03.11

Visualizza il profilo

Torna in alto Andare in basso

Re: doppia aggregazione e frequenza

Messaggio  GiampiMaz il Lun 17 Feb 2014 - 17:30

Ciao Nanci
rispondo allora alla prima originale domanda, perchè sia la tua query che quella di Admin estraggono  i pz con cardiopatie e/o angioplastica ma non registrano per ogni paziente il tipo di patologia (ICD9)?.
RISPOSTA: Perché non era stato richiesto e non rientrava nella logica della query.
Non è necessario che le condizioni che vengono poste in WHERE siano poi mostrate in SELECT!

Mi spiego, la presenza di cardiopatia e/o angioplastica (originariamente era stato chiesto cardiopatia E angioplastica) è già implicita nel fatto stesso che i pazienti siano stati estratti (la presenza della cardiopatie e/o angioplastica è verificata in WHERE), se vuoi che appaia nel risultato il codice ICD9 della patologia lo devi richiedere in SELECT.

ad esempio aggiungi alla mia query o a quella dell'Admin in SELECT la subquery

(select list (distinct x.cp_code) from cart_pazpbl x where p.codice=x.codice and ((x.cp_code like '41[01234]%' ) or x.cp_code like 'v45.82') ) AS _codici_

questa subquery dice di estrarre e mostrare la lista (LIST) dei codici icd9 che soddisfano ai criteri di WHERE della subquery cioè cardiopatia e/o angioplastica. Il DISTINCT dice che se vi sono due o più codici identici ne mostra uno solo.

La mia query poi aveva lo scopo di verificare la presenza contemporanea di cardiopatia con angioplastica. A volte per capire perché una query dà risultati inattesi occorre farne un'altra che renda più espliciti i dati estratti.
Invece di codici mettere Sì o No rendeva subito chiaro se le due patologie coesistevano.

giampiero
PS per quanto riguarda la tua ultima query ... pensa alle parentesi.
GiampiMaz
GiampiMaz
Membro Junior
Membro Junior

Messaggi : 122
Punti : 3116
Voti per importanza dei messaggi : 33
Data d'iscrizione : 20.02.11

Visualizza il profilo

Torna in alto Andare in basso

doppia aggregazione

Messaggio  nanci giacinto il Mar 18 Feb 2014 - 22:50

Grazie Giampi la tua subquery funziona perfettamente. Per quanto riguarda le parentesi della query che si blocca è stato solo un problema di copia e incolla. Grazie ancora  per gli insegnamenti, comunque continuo a sperare che da qualche parte c'è un manuale per le query.
nanci giacinto
nanci giacinto
Membro Junior
Membro Junior

Messaggi : 126
Punti : 3134
Voti per importanza dei messaggi : -1
Data d'iscrizione : 02.03.11

Visualizza il profilo

Torna in alto Andare in basso

Re: doppia aggregazione e frequenza

Messaggio  GiampiMaz il Gio 20 Feb 2014 - 10:21

Ciao Nanci
rispondo al problema che avevi posto per la tua ultima query (quella che non si fermava), mettiti comodo perchè il discorso non è breve.

Come accennavo, e come hai capito, il problema era nelle parentesi. La Logica Booleana apparentemente semplice con le sue istruzioni AND e OR può diventare rapidamente complessa quando le chiediamo cose complesse e le parentesi diventare una selva (esattamente come nell'algebra del liceo).

select distinct p.cognome, p.nome, days(p.nascita, today())/365 eta, p.sesso sesso,
(select list (distinct x.co_des) from cart_terap x where p.codice=x.codice and x.co_atc like 'C07%' and x.data_open > today() - 365) AS beta_bloc,
(select pa.frequenza from cart_press pa where p.codice=pa.codice and pa.frequenza Is Not Null And Not Exists (Select a1.codice From cart_press a1
Where pa.codice = a1.codice  And (a1.data_open > pa.data_open Or (a1.data_open = pa.data_open And a1.rowid>pa.rowid)) And a1.frequenza is Not Null) ) AS Frequenza,
(select distinct max(z.co_des) from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC04' ) Clopidogrel,
(select distinct max(z.co_des) from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC05' ) Ticlopidina,
(select distinct max(z.co_des) from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC06' ) Ac_Acetilsalicilico,
(select distinct max(z.co_des) from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC56' ) Ac_Acetilsal_PPI,
(select distinct max(z.co_des) from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC22' ) Prasugrel,
(select distinct max(z.co_des) from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC24' ) Brilique,
(select distinct max(z.co_des) from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC11' ) Ventavis,
(select distinct max(z.co_des) from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC30' ) Duoplavin,
(select list (distinct x.cp_code) from cart_pazpbl x where p.codice=x.codice and ((x.cp_code like '41[01234]%' ) or x.cp_code like 'v45.82') ) AS _codici_

FROM pazienti p, nos_002 n
WHERE p.codice=n.codice
and p.codice IN (select x.codice from cart_pazpbl x where p.codice=x.codice and (x.cp_code like '41[01234]%' OR x.cp_code like 'v45.82' ))

AND
( p.codice IN (select z.codice from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC04' and z.data_open between today() - 180 and today())
or p.codice IN (select z.codice from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC05' and z.data_open between today() - 180 and today())
or p.codice IN (select z.codice from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC06' and z.data_open between today() - 180 and today())
or p.codice IN (select z.codice from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC22' and z.data_open between today() - 180 and today())
or p.codice IN (select z.codice from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC24' and z.data_open between today() - 180 and today())
or p.codice IN (select z.codice from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC11' and z.data_open between today() - 180 and today())
or p.codice IN (select z.codice from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC30' and z.data_open between today() - 180 and today())

)
AND (n.pa_drevoca IS NULL or n.pa_drevoca >TODAY()) AND (p.decesso IS NULL)
AND p.pa_convenzione='S'
AND n.pa_medi like '%'
order by 1,2


ho aggiunto la parentesi in modo che non vengano mescolati AND e OR ma siano separati e quindi l'analisi delle condizioni di verità della query possano svolgersi. (ho anche modificato leggermente i codici degli antiaggreganti).

Ma ora la domanda è: la query risponde a quanto richiesto? La risposta è no.
Si era chiesto di selezionare i pazienti che fanno doppia antiaggregazione (oltre ad avere cardiopatia e/o angioplastica). Ora la query selezione (WHERE) i pazienti che hanno cardiopatia e/o angioplastica e contemporaneamente (AND) abbiano prescritto negli ultimi 180 giorni ALMENO UNO degli antiaggreganti(OR). Quindi NON selezioniamo una doppia antiaggregazione ma tutti i pazienti che fanno un antiaggregante anche singolo. Non ci aiuta molto poi l'elenco in SELECT, infatti qui usiamo delle subquery perchè ci mostrino il nome degli antiaggreganti usati. Ma anche se sono sub sono pur sempre query che usano le Tabelle, quindi se non vi specifici il periodo da analizzare cercherà in tutto l'archivio ed estrarrà il nome di un antiaggregante prescritto magari anni prima.
Una soluzione parziale è quindi aggiungere la condizione 
and z.data_open between today() - 180 and today()
anche nelle subquery, esempio:

(select distinct max(z.co_des) from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC04' and z.data_open between today() - 180 and today()) Clopidogrel, ecc

Se però vogliamo che vengano veramente selezionati solo i pazienti con doppia antiaggregazione dobbiamo renderci conto che la situazione è complessa.
Abbiamo 2 codici per l'ASA (quello normale e quello con PPI), un codice per una associazione (duoplavin e similari che quindi basta da solo) ed altri 5 antiaggreganti (o più in realtà o meno se non vogliamo mettere quelli raramente usati e di cui io francamente non conosco le indicazioni). Occorrerà quindi creare con AND e OR e tante parentesi uno schema che tenga conto delle numerose combinazioni possibili.)
Limitandoci alla doppia aggregazione con l'aspirina (con o senza associazione PPI) dovremo mettere in WHERE


WHERE p.codice=n.codice
and p.codice IN (select x.codice from cart_pazpbl x where p.codice=x.codice and (x.cp_code like '41[01234]%' OR x.cp_code like 'v45.82' ))

AND
(
(
(
 p.codice IN (select z.codice from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC06' and z.data_open between today() - 180 and today()) 
OR p.codice IN (select z.codice from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC56' and z.data_open between today() - 180 and today()) 
)
AND 
(
 p.codice IN (select z.codice from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC0[45]'  and z.data_open between today() - 180 and today())
OR
 p.codice IN (select z.codice from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC22' and z.data_open between today() - 180 and today())
OR
 p.codice IN (select z.codice from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC24' and z.data_open between today() - 180 and today())
OR
 p.codice IN (select z.codice from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC11' and z.data_open between today() - 180 and today())
)
)

OR 
p.codice IN (select z.codice from cart_terap z where p.codice=z.codice and z.co_atc like 'B01AC30' and z.data_open between today() - 180 and today())
)

AND (n.pa_drevoca IS NULL or n.pa_drevoca >TODAY()) AND (p.decesso IS NULL)
AND p.pa_convenzione='S'
AND n.pa_medi like '%'
order by 1,2

in questa maniera, dopo aver posto le condizioni per le patologie,  nel primo blocco consideriamo assieme aspirina semplice OR aspirina protetta  e poi AND vediamo se fa anche uno dei vari antiaggreganti (collegati con OR).
Nel gruppo più esterno consideriamo OR che basta il duoplavin (già di per se doppio).

Un suggerimento quando si usa una struttura complessa è scrivendo aprire e chiudere subito le parentesi per non dimenticarne qualcuna. Editor evoluti usano indentare (spostare più o meno verso destra) le varie righe per avere visivamente il controllo dei vari livelli, purtroppo l'editor di millewin è obsoleto. Ma naturalmente occorre avere ben chiaro lo schema che si vuole ottenere.
Si potrebbe farla anche più semplice ma qui lo scopo è anche didattico. Sempre per didattica una strategia che uso per testare le query (è la parte più lunga e complessa!!!) è creare un paziente fittizio (magari come libera professione, non collegato con l'usl) e affliggerlo di tutte le malattie volute e con gli schemi terapeutici che vogliamo per vedere poi se correttamente compare nei risultati.

giampiero
GiampiMaz
GiampiMaz
Membro Junior
Membro Junior

Messaggi : 122
Punti : 3116
Voti per importanza dei messaggi : 33
Data d'iscrizione : 20.02.11

Visualizza il profilo

Torna in alto Andare in basso

doppia aggregazione

Messaggio  nanci giacinto il Gio 27 Feb 2014 - 23:02

caro Giampi dire ottimo è dire poco e grazie per la didattica. permettimi una ultima domanda (solo a scopo didattico)  anche se ormai ho proprio tutto: come aggiungere a questa query anche l'ICD9 oltre la frequenza? così com'è estrae i pz con la patologia ma non registra il tipo di patologia. Se non hai tempo va bene lo stesso. grazie ancora

select distinct p.cognome, p.nome, days(p.nascita, today())/365 eta, p.sesso sesso,
(select pa.frequenza from cart_press pa where p.codice=pa.codice and 
pa.frequenza Is Not Null And Not Exists (Select a1.codice From cart_press a1
Where pa.codice = a1.codice  And (a1.data_open > pa.data_open
Or (a1.data_open = pa.data_open And a1.rowid>pa.rowid)) And a1.frequenza is Not Null) ) AS Frequenza,

from pazienti p, nos_002 n
where p.codice=n.codice
and p.codice IN (select x.codice from cart_pazpbl x where p.codice=x.codice and (x.cp_code like '41[01234]%' OR x.cp_code like 'v45.82' ))

AND (n.pa_drevoca IS NULL or n.pa_drevoca >TODAY()) AND (p.decesso IS NULL)
AND p.pa_convenzione='S'
AND n.pa_medi like '%'
order by 1,2


 
nanci giacinto
nanci giacinto
Membro Junior
Membro Junior

Messaggi : 126
Punti : 3134
Voti per importanza dei messaggi : -1
Data d'iscrizione : 02.03.11

Visualizza il profilo

Torna in alto Andare in basso

Re: doppia aggregazione e frequenza

Messaggio  GiampiMaz il Ven 28 Feb 2014 - 17:16

Se ho capito bene ne abbiamo già scritto prima pochi post fa, aggiungi a SELECT

(select list (distinct x.cp_code) from cart_pazpbl x where p.codice=x.codice and ((x.cp_code like '41[01234]%' ) or x.cp_code like 'v45.82') ) AS _codici_,

se vuoi i nomi delle patologie aggiungi

(select list (distinct x.Nome_Pbl) from cart_pazpbl x where p.codice=x.codice and ((x.cp_code like '41[01234]%' ) or x.cp_code like 'v45.82') ) AS _patologie_

direi che questo è il sistema più rapido.
Comunque, come ricordava il nostro Admin, chi voglia farsi delle query non ha che da analizzare le oramai numerose che sono state postate. C'è di tutto, un poco di bricolage ed è fatta.
giampiero




select distinct p.cognome, p.nome, days(p.nascita, today())/365 eta, p.sesso sesso,
(select pa.frequenza from cart_press pa where p.codice=pa.codice and 
pa.frequenza Is Not Null And Not Exists (Select a1.codice From cart_press a1
Where pa.codice = a1.codice  And (a1.data_open > pa.data_open
Or (a1.data_open = pa.data_open And a1.rowid>pa.rowid)) And a1.frequenza is Not Null) ) AS Frequenza,

(select list (distinct x.cp_code) from cart_pazpbl x where p.codice=x.codice and ((x.cp_code like '41[01234]%' ) or x.cp_code like 'v45.82') ) AS _codici_,


(select list (distinct x.Nome_Pbl) from cart_pazpbl x where p.codice=x.codice and ((x.cp_code like '41[01234]%' ) or x.cp_code like 'v45.82') ) AS _patologie_

from pazienti p, nos_002 n
where p.codice=n.codice
and p.codice IN (select x.codice from cart_pazpbl x where p.codice=x.codice and (x.cp_code like '41[01234]%' OR x.cp_code like 'v45.82' ))
AND (n.pa_drevoca IS NULL or n.pa_drevoca >TODAY()) AND (p.decesso IS NULL)
AND p.pa_convenzione='S'
AND n.pa_medi like '%'
order by 1,2
GiampiMaz
GiampiMaz
Membro Junior
Membro Junior

Messaggi : 122
Punti : 3116
Voti per importanza dei messaggi : 33
Data d'iscrizione : 20.02.11

Visualizza il profilo

Torna in alto Andare in basso

Re: doppia aggregazione e frequenza

Messaggio  Contenuto sponsorizzato


Contenuto sponsorizzato


Torna in alto Andare in basso

Pagina 2 di 2 Precedente  1, 2

Torna in alto


 
Permessi di questa sezione del forum:
Non puoi rispondere agli argomenti in questo forum