SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
+2
Admin
Lucio Mignone
6 partecipanti
Pagina 1 di 2
Pagina 1 di 2 • 1, 2
SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
Qualcuno mi aiuta a capire perché questa DISTINCT non funziona?
Volendo estrarre tutti i pz a cui è stato calcolato il BMI DISTINCT non mi riporta solo l'ultimo rilievo ma mostra invece tutti i BMI rilevati per quel paziente:
SELECT distinct cognome, nome,datavisita, accertamento, risults
FROM v_accertamenti
WHERE accertamento Like 'BMI%'
and ((today()-datanasc)/365) between '40' and '60'
ORDER By cognome, nome,datavisita
Volendo estrarre tutti i pz a cui è stato calcolato il BMI DISTINCT non mi riporta solo l'ultimo rilievo ma mostra invece tutti i BMI rilevati per quel paziente:
SELECT distinct cognome, nome,datavisita, accertamento, risults
FROM v_accertamenti
WHERE accertamento Like 'BMI%'
and ((today()-datanasc)/365) between '40' and '60'
ORDER By cognome, nome,datavisita
Ultima modifica di Lucio Mignone il Mer 30 Nov 2011 - 0:34 - modificato 2 volte.
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
La clausola DISTINCT dice al motore database di prendere solo il primo record nel caso vi siano più record con gli stessi dati, ma in questo caso i dati riferiti a data visita e valori del BMI sono differenti, quindi la clausola non può essere usata.
Prova questa:
SELECT a.cognome, a.nome, Years(a.datanasc, TODAY ()) as Eta, a.sesso, MAX(a.datavisita) Data_Visita, a.accertamento, a.risults Risultato
FROM v_accertamenti a
WHERE a. accertamento Like 'BMI%'
AND not exists (select codice
FROM v_accertamenti a1
WHERE a1.codice=a.codice AND a1.accertamento=a.accertamento AND a1.datavisita>a.datavisita)
AND eta between '40' and '60'
GROUP BY cognome, nome,a.datanasc, sesso, datavisita, accertamento, risults
ORDER By 1,2
Prova questa:
SELECT a.cognome, a.nome, Years(a.datanasc, TODAY ()) as Eta, a.sesso, MAX(a.datavisita) Data_Visita, a.accertamento, a.risults Risultato
FROM v_accertamenti a
WHERE a. accertamento Like 'BMI%'
AND not exists (select codice
FROM v_accertamenti a1
WHERE a1.codice=a.codice AND a1.accertamento=a.accertamento AND a1.datavisita>a.datavisita)
AND eta between '40' and '60'
GROUP BY cognome, nome,a.datanasc, sesso, datavisita, accertamento, risults
ORDER By 1,2
Ultima modifica di Admin il Dom 6 Nov 2011 - 2:12 - modificato 1 volta.
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
Prova con :
SELECT Distinct cognome, nome, ((Today()-datanasc)/365) As eta, ' ', Max(datavisita) As Bmi_d, accertamento As Bmi, Cast(risultn As Dec(4,1)) As Bmi_v
FROM v_accertamenti a
Where accertamento Like '%BMI%' And Not Exists
(Select a1.codice FROM v_Accertamenti a1 Where a1.codice = a.codice And a1.accertamento Like '%BMI%' And a1.datavisita > a.datavisita)
And eta Between 40 And 60
Group By cognome, nome, eta, accertamento, risults
Order By 1, 2, 3
Non ho familiarità con le viste, per cui non garantisco il risultato .
Rispetto all' estrazione diretta da mio mille.db con la query :
Select Distinct Cast(cognome As Char(16)), nome, p.sesso, p.nascita, (Year(Today())-Year(p.nascita)) As eta,
(Select Cast(a.ac_val+0 As Dec(4,1)) From cart_accert a Where ( a.codice=p.codice And a.ac_code Like '2609' And a.ac_val Is Not Null ) And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And (a1.data_open > a.data_open Or (a1.data_open
= a.data_open And a1.rowid > a.rowid)) And a1.ac_val Is Not Null))
_bmi_v_, ' ',
(Select a.data_open From cart_accert a Where ( a.codice=p.codice And a.ac_code Like '2609' And a.ac_val Is Not Null ) And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And (a1.data_open > a.data_open Or (a1.data_open
= a.data_open And a1.rowid > a.rowid)) And a1.ac_val Is Not Null))
_Bmi_d_,
(IF _bmi_v_< '18.5' Then ' SottoPeso ' Else IF ( _bmi_v_ Between '18.5' And '24.9') Then ' NormoPeso ' Else IF (_bmi_v_ Between '25' And '29.9') Then ' Sovrappeso ' Else IF (_bmi_v_ Between '30' And '34.9') Then ' Obesità I ' Else IF (_bmi_v_ Between '35' And '39.9') Then ' Obesità II ' Else IF ( _bmi_v_ >'39.9') Then ' Obesità III ' Else ' ? ' Endif Endif Endif Endif Endif Endif)
_commento_
FROM pazienti p , nos_002 n
Where p.codice=n.codice
And n.pa_medi ''
And eta Between 40 And 60
And (n.pa_drevoca Is Null Or n.pa_drevoca > Today() Or (n.pa_drevoca > Today()-365 And motivo_revoca ='S' ))
And p.pa_convenzione = 'S'
Order By 1, 2, 3
i due sets ottenuti presentano differenze non trascurabili .
Un saluto da Sergio Tomasini , Orzivecchi ( BS )
SELECT Distinct cognome, nome, ((Today()-datanasc)/365) As eta, ' ', Max(datavisita) As Bmi_d, accertamento As Bmi, Cast(risultn As Dec(4,1)) As Bmi_v
FROM v_accertamenti a
Where accertamento Like '%BMI%' And Not Exists
(Select a1.codice FROM v_Accertamenti a1 Where a1.codice = a.codice And a1.accertamento Like '%BMI%' And a1.datavisita > a.datavisita)
And eta Between 40 And 60
Group By cognome, nome, eta, accertamento, risults
Order By 1, 2, 3
Non ho familiarità con le viste, per cui non garantisco il risultato .
Rispetto all' estrazione diretta da mio mille.db con la query :
Select Distinct Cast(cognome As Char(16)), nome, p.sesso, p.nascita, (Year(Today())-Year(p.nascita)) As eta,
(Select Cast(a.ac_val+0 As Dec(4,1)) From cart_accert a Where ( a.codice=p.codice And a.ac_code Like '2609' And a.ac_val Is Not Null ) And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And (a1.data_open > a.data_open Or (a1.data_open
= a.data_open And a1.rowid > a.rowid)) And a1.ac_val Is Not Null))
_bmi_v_, ' ',
(Select a.data_open From cart_accert a Where ( a.codice=p.codice And a.ac_code Like '2609' And a.ac_val Is Not Null ) And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And (a1.data_open > a.data_open Or (a1.data_open
= a.data_open And a1.rowid > a.rowid)) And a1.ac_val Is Not Null))
_Bmi_d_,
(IF _bmi_v_< '18.5' Then ' SottoPeso ' Else IF ( _bmi_v_ Between '18.5' And '24.9') Then ' NormoPeso ' Else IF (_bmi_v_ Between '25' And '29.9') Then ' Sovrappeso ' Else IF (_bmi_v_ Between '30' And '34.9') Then ' Obesità I ' Else IF (_bmi_v_ Between '35' And '39.9') Then ' Obesità II ' Else IF ( _bmi_v_ >'39.9') Then ' Obesità III ' Else ' ? ' Endif Endif Endif Endif Endif Endif)
_commento_
FROM pazienti p , nos_002 n
Where p.codice=n.codice
And n.pa_medi ''
And eta Between 40 And 60
And (n.pa_drevoca Is Null Or n.pa_drevoca > Today() Or (n.pa_drevoca > Today()-365 And motivo_revoca ='S' ))
And p.pa_convenzione = 'S'
Order By 1, 2, 3
i due sets ottenuti presentano differenze non trascurabili .
Un saluto da Sergio Tomasini , Orzivecchi ( BS )
Cervino- Membro Junior
- Messaggi : 245
Punti : 5281
Voti per importanza dei messaggi : 22
Data d'iscrizione : 03.03.11
Età : 70
Località : Orzivecchi (BS)
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
Grazie a Giuseppe e Sergio per avermi aiutato.
Non riuscivo a capire perchè Distinct non funzionasse. Ora lo so!
Grazie anche a tutti i colleghi del forum che in ogni occasione puntualmente mi aiutano e mi consentono ogni volta di capire qualcosa in più e compiere piccoli passi per essere un po' più autonomo...
Non riuscivo a capire perchè Distinct non funzionasse. Ora lo so!
Grazie anche a tutti i colleghi del forum che in ogni occasione puntualmente mi aiutano e mi consentono ogni volta di capire qualcosa in più e compiere piccoli passi per essere un po' più autonomo...
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
Prova con :
SELECT Distinct cognome, nome,
((Today()-datanasc)/365) As eta, ' ', Max(datavisita) As Bmi_d,
accertamento As Bmi, Cast(risultn As Dec(4,1)) As Bmi_v
FROM v_accertamenti a
Where accertamento Like '%BMI%' And Not Exists
(Select
a1.codice FROM v_Accertamenti a1 Where a1.codice = a.codice And
a1.accertamento Like '%BMI%' And a1.datavisita > a.datavisita)
And eta Between 40 And 60
Group By cognome, nome, eta, accertamento, risults
Order By 1, 2, 3
Questa mi da errore ed ho capito perché: in GROUP BY c'è risultS al posto di risultN
Cervino ha scritto:Prova con :
.........................
Rispetto all' estrazione diretta da mio mille.db con la query :
Select Distinct Cast(cognome As Char(16)), nome, p.sesso, p.nascita, (Year(Today())-Year(p.nascita)) As eta,
(Select Cast(a.ac_val+0 As Dec(4,1)) From cart_accert a Where ( a.codice=p.codice And a.ac_code Like '2609' And a.ac_val Is Not Null ) And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And (a1.data_open > a.data_open Or (a1.data_open
= a.data_open And a1.rowid > a.rowid)) And a1.ac_val Is Not Null))
_bmi_v_, ' ',
(Select a.data_open From cart_accert a Where ( a.codice=p.codice And a.ac_code Like '2609' And a.ac_val Is Not Null ) And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And (a1.data_open > a.data_open Or (a1.data_open
= a.data_open And a1.rowid > a.rowid)) And a1.ac_val Is Not Null))
_Bmi_d_,
(IF _bmi_v_< '18.5' Then ' SottoPeso ' Else IF ( _bmi_v_ Between '18.5' And '24.9') Then ' NormoPeso ' Else IF (_bmi_v_ Between '25' And '29.9') Then ' Sovrappeso ' Else IF (_bmi_v_ Between '30' And '34.9') Then ' Obesità I ' Else IF (_bmi_v_ Between '35' And '39.9') Then ' Obesità II ' Else IF ( _bmi_v_ >'39.9') Then ' Obesità III ' Else ' ? ' Endif Endif Endif Endif Endif Endif)
_commento_
FROM pazienti p , nos_002 n
Where p.codice=n.codice
And n.pa_medi ''
And eta Between 40 And 60
And (n.pa_drevoca Is Null Or n.pa_drevoca > Today() Or (n.pa_drevoca > Today()-365 And motivo_revoca ='S' ))
And p.pa_convenzione = 'S'
Order By 1, 2, 3
i due sets ottenuti presentano differenze non trascurabili .
Un saluto da Sergio Tomasini , Orzivecchi ( BS )
Questa non mi funziona, non capisco perché...
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
Salve
hai messo al posto di
And n.pa_medi ''
And n.pa_medi= tuo codice di medicine di gruppo
?
così dovrebbe funzionare ciao
giampiero
hai messo al posto di
And n.pa_medi ''
And n.pa_medi= tuo codice di medicine di gruppo
?
così dovrebbe funzionare ciao
giampiero
GiampiMaz- Membro Junior
- Messaggi : 122
Punti : 5187
Voti per importanza dei messaggi : 33
Data d'iscrizione : 20.02.11
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
Ecco (a scopo didattico nel senso che sto cercando di imparare) un rimaneggiamento della query del MAESTRO Sergio:
Select Distinct Cast(cognome As Char(16)), nome, p.sesso, p.nascita, (Year(Today())-Year(p.nascita)) As eta,
(Select Cast(a.ac_val+0 As Dec(4,1)) From cart_accert a Where ( a.codice=p.codice And a.ac_code Like '2609') And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And (a1.data_open > a.data_open)))
BMI, '-' ,
(Select a.data_open From cart_accert a Where ( a.codice=p.codice And a.ac_code Like '2609') And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And (a1.data_open > a.data_open )))
Data,
(IF BMI< '18.5' Then ' SottoPeso ' Else IF ( BMI Between '18.5' And '24.9') Then ' NormoPeso ' Else IF ( BMI Between '25' And '29.9') Then ' Sovrappeso ' Else IF ( BMI Between '30' And '34.9') Then ' Obesità I ' Else IF ( BMI Between '35' And '39.9') Then ' Obesità II ' Else IF ( BMI >'39.9') Then ' Obesità III ' Else ' ? ' Endif Endif Endif Endif Endif Endif)
_commento_
FROM pazienti p , nos_002 n
Where p.codice=n.codice
AND BMI is not null
AND p.Decesso is null
And (n.pa_drevoca Is Null Or n.pa_drevoca > Today())
And p.pa_convenzione = 'S'
And eta Between 40 And 60
AND p.data_open BETWEEN '2011/01/01' AND '2011/12/31'
Order By 1, 2, 4
Select Distinct Cast(cognome As Char(16)), nome, p.sesso, p.nascita, (Year(Today())-Year(p.nascita)) As eta,
(Select Cast(a.ac_val+0 As Dec(4,1)) From cart_accert a Where ( a.codice=p.codice And a.ac_code Like '2609') And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And (a1.data_open > a.data_open)))
BMI, '-' ,
(Select a.data_open From cart_accert a Where ( a.codice=p.codice And a.ac_code Like '2609') And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And (a1.data_open > a.data_open )))
Data,
(IF BMI< '18.5' Then ' SottoPeso ' Else IF ( BMI Between '18.5' And '24.9') Then ' NormoPeso ' Else IF ( BMI Between '25' And '29.9') Then ' Sovrappeso ' Else IF ( BMI Between '30' And '34.9') Then ' Obesità I ' Else IF ( BMI Between '35' And '39.9') Then ' Obesità II ' Else IF ( BMI >'39.9') Then ' Obesità III ' Else ' ? ' Endif Endif Endif Endif Endif Endif)
_commento_
FROM pazienti p , nos_002 n
Where p.codice=n.codice
AND BMI is not null
AND p.Decesso is null
And (n.pa_drevoca Is Null Or n.pa_drevoca > Today())
And p.pa_convenzione = 'S'
And eta Between 40 And 60
AND p.data_open BETWEEN '2011/01/01' AND '2011/12/31'
Order By 1, 2, 4
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
Admin ha scritto:Ecco (a scopo didattico nel senso che sto cercando di imparare) un rimaneggiamento della query del MAESTRO Sergio:
Select Distinct Cast(cognome As Char(16)), nome, p.sesso, p.nascita, (Year(Today())-Year(p.nascita)) As eta,
(Select Cast(a.ac_val+0 As Dec(4,1)) From cart_accert a Where ( a.codice=p.codice And a.ac_code Like '2609') And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And (a1.data_open > a.data_open)))
BMI, '-' ,
(Select a.data_open From cart_accert a Where ( a.codice=p.codice And a.ac_code Like '2609') And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And (a1.data_open > a.data_open )))
Data,
(IF BMI< '18.5' Then ' SottoPeso ' Else IF ( BMI Between '18.5' And '24.9') Then ' NormoPeso ' Else IF ( BMI Between '25' And '29.9') Then ' Sovrappeso ' Else IF ( BMI Between '30' And '34.9') Then ' Obesità I ' Else IF ( BMI Between '35' And '39.9') Then ' Obesità II ' Else IF ( BMI >'39.9') Then ' Obesità III ' Else ' ? ' Endif Endif Endif Endif Endif Endif)
_commento_
FROM pazienti p , nos_002 n
Where p.codice=n.codice
AND BMI is not null
AND p.Decesso is null
And (n.pa_drevoca Is Null Or n.pa_drevoca > Today())
And p.pa_convenzione = 'S'
And eta Between 40 And 60
AND p.data_open BETWEEN '2011/01/01' AND '2011/12/31'
Order By 1, 2, 4
Giuseppe ottima idea il rimaneggiamento! Aiuta ad imparare.
Potresti però evidenziare (magari con un colore differente) le parti che hai modificato al fine di identificarle meglio, facilitare un confronto e cercare di capire ed apprendere le differenze?
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
GiampiMaz ha scritto:Salve
hai messo al posto di
And n.pa_medi ''
And n.pa_medi= tuo codice di medicine di gruppo
?
così dovrebbe funzionare ciao
giampiero
Ok Funziona.
Mi scusi Maestro per essermi fatto sfuggire il "piccolo" dettaglio...
Tu se' lo mio maestro e 'l mio autore;
tu se' solo colui da cu' io tolsi
lo bello stilo che m'ha fatto onore
Ultima modifica di Lucio Mignone il Dom 6 Nov 2011 - 17:14 - modificato 1 volta.
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
Cercando di capire meglio le query e le differenze tra la query originale di Sergio e le modifiche effettuate da Giuseppe:
La query di Sergio (quella più lunga) e modificata da Giuseppe mostra solo 32 pz su 1600 perché limita la ricerca all'ultimo anno e non mostra i pz che non hanno il BMI calcolato.
La query originale di Sergio (sempre quellla lunga) mostra 1100 pz su 1600 ma non capisco bene il criterio con il quale seleziona i 1100 pz e mostra anche i pz che non hanno il BMI calcolato.
La query di Sergio (quella più lunga) e modificata da Giuseppe mostra solo 32 pz su 1600 perché limita la ricerca all'ultimo anno e non mostra i pz che non hanno il BMI calcolato.
La query originale di Sergio (sempre quellla lunga) mostra 1100 pz su 1600 ma non capisco bene il criterio con il quale seleziona i 1100 pz e mostra anche i pz che non hanno il BMI calcolato.
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
Lucio Mignone ha scritto: Giuseppe ottima idea il rimaneggiamento! Aiuta ad imparare.
Potresti però evidenziare (magari con un colore differente) le parti che hai modificato al fine di identificarle meglio, facilitare un confronto e cercare di capire ed apprendere le differenze?
Ho semplicemente "sfrondato" le subquery di clausole che di fatto non avevano alcuna azione utile (Or (a1.data_open = a.data_open And a1.rowid > a.rowid)) And a1.ac_val Is Not Null)).
Ho aggiunto o modificato alcune clausole alla fine in modo da avere effetto sull'estrazione finale:
AND BMI is not null
AND p.Decesso is null
And (n.pa_drevoca Is Null Or n.pa_drevoca > Today())
And eta Between 40 And 60
AND p.data_open BETWEEN '2011/01/01' AND '2011/12/31'
Il significato non sfugge certo ad un arguto osservatore come te.
In effetti quello che più mi piace del linguaggio SQL è la possibilità di ottenere dei risultati semplicemente ragionando e questi sono tanto più efficaci quanto più chiara è la scrittura delle query, lineare, essenziale, e perché no, anche elegante. Ai Maestri rivolgo l'invito a perseguire sempre questi intenti, ciò renderà sicuramente più semplice l'apprendistato dei discepoli. Grazie.
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
Admin ha scritto:Lucio Mignone ha scritto: Giuseppe ottima idea il rimaneggiamento! Aiuta ad imparare.
Potresti però evidenziare (magari con un colore differente) le parti che hai modificato al fine di identificarle meglio, facilitare un confronto e cercare di capire ed apprendere le differenze?
Ho semplicemente "sfrondato" le subquery di clausole che di fatto non avevano alcuna azione utile (Or (a1.data_open = a.data_open And a1.rowid > a.rowid)) And a1.ac_val Is Not Null)).
Ho aggiunto o modificato alcune clausole alla fine in modo da avere effetto sull'estrazione finale:
AND BMI is not null
AND p.Decesso is null
And (n.pa_drevoca Is Null Or n.pa_drevoca > Today())
And eta Between 40 And 60
AND p.data_open BETWEEN '2011/01/01' AND '2011/12/31'
Il significato non sfugge certo ad un arguto osservatore come te.
In effetti quello che più mi piace del linguaggio SQL è la possibilità di ottenere dei risultati semplicemente ragionando e questi sono tanto più efficaci quanto più chiara è la scrittura delle query, lineare, essenziale, e perché no, anche elegante. Ai Maestri rivolgo l'invito a perseguire sempre questi intenti, ciò renderà sicuramente più semplice l'apprendistato dei discepoli. Grazie.
Grazie davvero per l'aiuto a te ed a tutti.
Quello che ancora mi rimane difficile è capire bene il giochino di questa Select
e cioé a cosa serva creare dell' a1. codice a1.accertamento a1.datavisita
Select a1.codice FROM v_Accertamenti a1 Where a1.codice = a.codice And a1.accertamento Like '%BMI%' And a1.datavisita > a.datavisita
Tu se' lo mio maestro e 'l mio autore;
tu se' solo colui da cu' io tolsi
lo bello stilo che m'ha fatto onore
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
Lucio Mignone ha scritto:Grazie davvero per l'aiuto a te ed a tutti.
Quello che ancora mi rimane difficile è capire bene il giochino di questa Select
e cioé a cosa serva creare dell' a1. codice a1.accertamento a1.datavisita
Select a1.codice FROM v_Accertamenti a1 Where a1.codice = a.codice And a1.accertamento Like '%BMI%' And a1.datavisita > a.datavisita
Tu se' lo mio maestro e 'l mio autore;
tu se' solo colui da cu' io tolsi
lo bello stilo che m'ha fatto onore
Questi versi fanno venire una stretta al cuore; quali illustri personaggi hanno fatto GRANDE la nostra ITALIA e quani altri oggi l'hanno fatta diventare misera.
Comunque, bando alla tristezza, la selezione è semllicemente un artifizio per far comparire nell'estrazione solo i risultati più recenti. Serve cioè a selezionare una data di visita quando non ne esiste un'altra, in un'estrazione fittizia, più recente.
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
Svariete query negli anni sono state proposte e/o modificate sul Forum di MW ( attuale e precedente ); inoltre la sincronizzazione del mille.db esclude incomprensibilmente le operazioni eseguibili da MilleUtilità ( testi, queries, ...) ed avendo almeno cinque installazioni diverse di MW e MU su vari hosts, diventa problematico cercare la soluzione ottimale senza incorrere in imprecisioni.
La prima query :
Select Distinct cognome, nome, ((Today()-datanasc)/365) As eta, ' ', Max(datavisita) As Bmi_d, accertamento As Bmi, Cast(risultn As Dec(4,1)) As Bmi_v
FROM v_accertamenti a
Where accertamento Like '%BMI%' And Not Exists
(Select a1.codice FROM v_Accertamenti a1 Where a1.codice = a.codice And a1.accertamento Like '%BMI%' And a1.datavisita > a.datavisita)
And eta Between 40 And 60
Group By cognome, nome, eta, accertamento, risults
Order By 1, 2, 3
è uguale a quella proposta quasi in contemporanea da Giuseppe; tuttavia la apparente discrepanza fra : risultn e risults è voluta e comunque sul mio mille.db funziona ( misteri delle Viste )
La seconda query è stata rimaneggiata da varie precedenti ma ad una attenta analisi è risultata a volte imprecisa; attualmente la query ottimale per estrarre il BMI escludendo il periodo della gravidanza dovrebbe forse (?) essere :
Select Cast(cognome As Char(18)), nome, sesso, nascita, (Days(nascita, Today())/365) As eta, ' ',
(Select Max(a.data_open) From cart_accert a Where a.codice = p.codice And a.ac_code Like '2609' And ac_val Is Not Null And a.codice Not IN (Select codice From cart_problemi l Where l.codice = a.codice And cp_code Like 'V22%' And (a.data_open Between l.data_open+61 And l.data_open + 340 )) And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And a1.codice Not IN (Select codice From cart_problemi l Where l.codice = a1.codice And cp_code Like 'V22%' And (a1.data_open Between l.data_open+31 And l.data_open + 340 )) And (a1.data_open > a.data_open Or (a1.data_open = a.data_open And a1.rowid > a.rowid)) And a1.ac_val Is Not Null)
And a.data_open Between Today()-10000 And Today())
_Bmi_d_,
(Select Cast(Max(a.ac_val) As Dec(4,1)) From cart_accert a Where a.codice = p.codice And ac_des Like '%BMI%' And a.data_open = _bmi_d_ )
_Bmi_v_,
(Select Cast(Max(a.ac_val) As Dec(4,1)) From cart_accert a Where a.codice = p.codice And ac_des Like 'Peso' And a.data_open = _bmi_d_ )
_Peso_,
(Select Cast(Max(a.ac_val) As Dec(4,1)) From cart_accert a Where a.codice = p.codice And ac_des Like 'Altezza' And a.data_open = _bmi_d_ )
_Altezza_,
(IF _bmi_v_< 20 And p.sesso = 'M' Then ' SottoPeso ' Else IF _bmi_v_< 19 And p.sesso = 'F' Then ' SottoPeso ' Else IF _bmi_v_ Between 20 And 24.9 And p.sesso = 'M' Then ' NormoPeso ' Else IF _bmi_v_ Between 19 And 24.9 And p.sesso = 'F' Then ' NormoPeso ' Else IF _bmi_v_ Between 25 And 29.9 Then ' Sovrappeso ' Else IF _bmi_v_ Between 30 And 34.9 Then ' Obesità I ' Else IF _bmi_v_ Between 35 And 39.9 Then ' Obesità II ' Else IF _bmi_v_ > 39.9 Then ' Obesità III ' Else ' ? ' Endif Endif Endif Endif Endif Endif Endif Endif )
As Diagnosi, Today() As DataQuery
FROM pazienti p INNER JOIN nos_002 n ON p.codice = n.codice
Where n.pa_medi Like '%' And eta >19.9 And _Bmi_v_ > 14.9
And p.pa_convenzione = 'S' And (n.pa_drevoca Is Null Or n.pa_drevoca > Today() Or (n.pa_drevoca Between Today()-365 And Today() And motivo_revoca ='S' ))And p.decesso Is Null
Order By 7, 1, 2
in alternativa per il solo BMI :
Select Cast(cognome As Char(18)), nome, sesso, nascita, (Days(nascita, Today())/365) As eta, ' ',
(Select Cast(Max(a.ac_val) As Dec(4,1)) From cart_accert a Where a.codice = p.codice And ac_des Like '%BMI%' And a.data_open = (Select Max(a.data_open) From cart_accert a Where a.codice = p.codice And a.ac_des Like '%BMI%' And ac_val Is Not Null And a.codice Not IN (Select codice From cart_problemi l Where l.codice = a.codice And cp_code Like 'V22%' And (a.data_open Between l.data_open+61 And l.data_open + 340 )) And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_des Like '%BMI%' And a1.codice Not IN (Select codice From cart_problemi l Where l.codice = a1.codice And cp_code Like 'V22%' And (a1.data_open Between l.data_open+31 And l.data_open + 340 )) And (a1.data_open > a.data_open Or (a1.data_open = a.data_open And a1.rowid > a.rowid)) And a1.ac_val Is Not Null)))
_Bmi_v_,
(IF _bmi_v_< 20 And p.sesso = 'M' Then ' SottoPeso ' Else IF _bmi_v_< 19 And p.sesso = 'F' Then ' SottoPeso ' Else IF _bmi_v_ Between 20 And 24.9 And p.sesso = 'M' Then ' NormoPeso ' Else IF _bmi_v_ Between 19 And 24.9 And p.sesso = 'F' Then ' NormoPeso ' Else IF _bmi_v_ Between 25 And 29.9 Then ' Sovrappeso ' Else IF _bmi_v_ Between 30 And 34.9 Then ' Obesità I ' Else IF _bmi_v_ Between 35 And 39.9 Then ' Obesità II ' Else IF _bmi_v_ > 39.9 Then ' Obesità III ' Else ' ? ' Endif Endif Endif Endif Endif Endif Endif Endif )
As Diagnosi, Today() As DataQuery
FROM pazienti p INNER JOIN nos_002 n ON p.codice = n.codice
Where n.pa_medi Like '%' And eta >19.9 And _Bmi_v_ > 14.9
And p.pa_convenzione = 'S' And (n.pa_drevoca Is Null Or n.pa_drevoca > Today() Or (n.pa_drevoca Between Today()-365 And Today() And motivo_revoca ='S' ))
Order By 7, 1, 2
Ringrazio Leonardo e Giampiero per il contributo ricevuto sul vecchio Forum al riguardo.
Scrivo da Linux per cui non posso verificare eventuali errori di trascrizione.
Un saluto da Sergio , Orzivecchi (BS)
La prima query :
Select Distinct cognome, nome, ((Today()-datanasc)/365) As eta, ' ', Max(datavisita) As Bmi_d, accertamento As Bmi, Cast(risultn As Dec(4,1)) As Bmi_v
FROM v_accertamenti a
Where accertamento Like '%BMI%' And Not Exists
(Select a1.codice FROM v_Accertamenti a1 Where a1.codice = a.codice And a1.accertamento Like '%BMI%' And a1.datavisita > a.datavisita)
And eta Between 40 And 60
Group By cognome, nome, eta, accertamento, risults
Order By 1, 2, 3
è uguale a quella proposta quasi in contemporanea da Giuseppe; tuttavia la apparente discrepanza fra : risultn e risults è voluta e comunque sul mio mille.db funziona ( misteri delle Viste )
La seconda query è stata rimaneggiata da varie precedenti ma ad una attenta analisi è risultata a volte imprecisa; attualmente la query ottimale per estrarre il BMI escludendo il periodo della gravidanza dovrebbe forse (?) essere :
Select Cast(cognome As Char(18)), nome, sesso, nascita, (Days(nascita, Today())/365) As eta, ' ',
(Select Max(a.data_open) From cart_accert a Where a.codice = p.codice And a.ac_code Like '2609' And ac_val Is Not Null And a.codice Not IN (Select codice From cart_problemi l Where l.codice = a.codice And cp_code Like 'V22%' And (a.data_open Between l.data_open+61 And l.data_open + 340 )) And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And a1.codice Not IN (Select codice From cart_problemi l Where l.codice = a1.codice And cp_code Like 'V22%' And (a1.data_open Between l.data_open+31 And l.data_open + 340 )) And (a1.data_open > a.data_open Or (a1.data_open = a.data_open And a1.rowid > a.rowid)) And a1.ac_val Is Not Null)
And a.data_open Between Today()-10000 And Today())
_Bmi_d_,
(Select Cast(Max(a.ac_val) As Dec(4,1)) From cart_accert a Where a.codice = p.codice And ac_des Like '%BMI%' And a.data_open = _bmi_d_ )
_Bmi_v_,
(Select Cast(Max(a.ac_val) As Dec(4,1)) From cart_accert a Where a.codice = p.codice And ac_des Like 'Peso' And a.data_open = _bmi_d_ )
_Peso_,
(Select Cast(Max(a.ac_val) As Dec(4,1)) From cart_accert a Where a.codice = p.codice And ac_des Like 'Altezza' And a.data_open = _bmi_d_ )
_Altezza_,
(IF _bmi_v_< 20 And p.sesso = 'M' Then ' SottoPeso ' Else IF _bmi_v_< 19 And p.sesso = 'F' Then ' SottoPeso ' Else IF _bmi_v_ Between 20 And 24.9 And p.sesso = 'M' Then ' NormoPeso ' Else IF _bmi_v_ Between 19 And 24.9 And p.sesso = 'F' Then ' NormoPeso ' Else IF _bmi_v_ Between 25 And 29.9 Then ' Sovrappeso ' Else IF _bmi_v_ Between 30 And 34.9 Then ' Obesità I ' Else IF _bmi_v_ Between 35 And 39.9 Then ' Obesità II ' Else IF _bmi_v_ > 39.9 Then ' Obesità III ' Else ' ? ' Endif Endif Endif Endif Endif Endif Endif Endif )
As Diagnosi, Today() As DataQuery
FROM pazienti p INNER JOIN nos_002 n ON p.codice = n.codice
Where n.pa_medi Like '%' And eta >19.9 And _Bmi_v_ > 14.9
And p.pa_convenzione = 'S' And (n.pa_drevoca Is Null Or n.pa_drevoca > Today() Or (n.pa_drevoca Between Today()-365 And Today() And motivo_revoca ='S' ))And p.decesso Is Null
Order By 7, 1, 2
in alternativa per il solo BMI :
Select Cast(cognome As Char(18)), nome, sesso, nascita, (Days(nascita, Today())/365) As eta, ' ',
(Select Cast(Max(a.ac_val) As Dec(4,1)) From cart_accert a Where a.codice = p.codice And ac_des Like '%BMI%' And a.data_open = (Select Max(a.data_open) From cart_accert a Where a.codice = p.codice And a.ac_des Like '%BMI%' And ac_val Is Not Null And a.codice Not IN (Select codice From cart_problemi l Where l.codice = a.codice And cp_code Like 'V22%' And (a.data_open Between l.data_open+61 And l.data_open + 340 )) And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_des Like '%BMI%' And a1.codice Not IN (Select codice From cart_problemi l Where l.codice = a1.codice And cp_code Like 'V22%' And (a1.data_open Between l.data_open+31 And l.data_open + 340 )) And (a1.data_open > a.data_open Or (a1.data_open = a.data_open And a1.rowid > a.rowid)) And a1.ac_val Is Not Null)))
_Bmi_v_,
(IF _bmi_v_< 20 And p.sesso = 'M' Then ' SottoPeso ' Else IF _bmi_v_< 19 And p.sesso = 'F' Then ' SottoPeso ' Else IF _bmi_v_ Between 20 And 24.9 And p.sesso = 'M' Then ' NormoPeso ' Else IF _bmi_v_ Between 19 And 24.9 And p.sesso = 'F' Then ' NormoPeso ' Else IF _bmi_v_ Between 25 And 29.9 Then ' Sovrappeso ' Else IF _bmi_v_ Between 30 And 34.9 Then ' Obesità I ' Else IF _bmi_v_ Between 35 And 39.9 Then ' Obesità II ' Else IF _bmi_v_ > 39.9 Then ' Obesità III ' Else ' ? ' Endif Endif Endif Endif Endif Endif Endif Endif )
As Diagnosi, Today() As DataQuery
FROM pazienti p INNER JOIN nos_002 n ON p.codice = n.codice
Where n.pa_medi Like '%' And eta >19.9 And _Bmi_v_ > 14.9
And p.pa_convenzione = 'S' And (n.pa_drevoca Is Null Or n.pa_drevoca > Today() Or (n.pa_drevoca Between Today()-365 And Today() And motivo_revoca ='S' ))
Order By 7, 1, 2
Ringrazio Leonardo e Giampiero per il contributo ricevuto sul vecchio Forum al riguardo.
Scrivo da Linux per cui non posso verificare eventuali errori di trascrizione.
Un saluto da Sergio , Orzivecchi (BS)
Cervino- Membro Junior
- Messaggi : 245
Punti : 5281
Voti per importanza dei messaggi : 22
Data d'iscrizione : 03.03.11
Età : 70
Località : Orzivecchi (BS)
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
Cervino ha scritto:Svariete query negli anni sono state proposte e/o modificate sul Forum di MW ( attuale e precedente ); inoltre la sincronizzazione del mille.db esclude incomprensibilmente le operazioni eseguibili da MilleUtilità ( testi, queries, ...) ed avendo almeno cinque installazioni diverse di MW e MU su vari hosts, diventa problematico cercare la soluzione ottimale senza incorrere in imprecisioni.
......
Un saluto da Sergio , Orzivecchi (BS)
Condivido. La mancata sincronizzazione di vari testi personalizzati e queries è una scocciatura.
Ti ringrazio ancora per l'aiuto, utilissimi i suggerimenti di tutti gli amici del forum, comincio a capirci qualcosa...
Se posso chiedere, non mi sono chiare queste istruzioni, ho guardato in rete ma non sono riuscito a capire molto di più:
Cast(Max(a.ac_val) As Dec(4,1) cast trasforma un numero da un formato ad un altro? Ma in che modo esattamente puo' essere utilizzata? Max prende ilvalore più recente se ce ne sonon molti? Dec stabilisce che il formato del numero decimale sia 4 cifre prima della virgola ed una dopo la virgola?
cast(a.ac_val AS FLOAT) Float proprio non l'ho capita...
risultn e risults non conoscendo bene la struttura dl database non capisco la differenza
Sui manuali sql che ci sono in rete queste istruzioni più complesse sono poco presenti. Potete suggerirmi un manuale oppure un testo per approfondire?
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
Ricordo che sul vecchio Forum scrivemmo (io, Sergio ed altri ) parecchie query sul BMI, che diedero atto a lunghe ,accese, dicussioni tra noi di tipo tecnico, in quanto esistevano problemi di non facile ed univoca soluzione . Oggi, purtroppo ho perso tutto quanto. Non le avevo trascritte ( o se trascritte non so più dove siano andate a finire) e mi piacerebbe rileggerle
Qualcuno è in grado di rintracciarle in qualche modo ?
draleo
Qualcuno è in grado di rintracciarle in qualche modo ?
draleo
draleo83- Membro Junior
- Messaggi : 225
Punti : 5307
Voti per importanza dei messaggi : 25
Data d'iscrizione : 21.02.11
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
Lucio Mignone ha scritto:.....
Se posso chiedere, non mi sono chiare queste istruzioni, ho guardato in rete ma non sono riuscito a capire molto di più:
Cast(Max(a.ac_val) As Dec(4,1) cast trasforma un numero da un formato ad un altro? Ma in che modo esattamente puo' essere utilizzata? Max prende ilvalore più recente se ce ne sonon molti? Dec stabilisce che il formato del numero decimale sia 4 cifre prima della virgola ed una dopo la virgola?
cast(a.ac_val AS FLOAT) Float proprio non l'ho capita...
risultn e risults non conoscendo bene la struttura dl database non capisco la differenza
Sui manuali sql che ci sono in rete queste istruzioni più complesse sono poco presenti. Potete suggerirmi un manuale oppure un testo per approfondire?
Cast(valore) As Dec(4,1) indica proprio un numero di 4 cifre intere ed una cifra decimale. Cast si usa appunto per variare il formato di un campo. Un altro uso è ad es: CAST(campo) AS char(20)). In questo caso determina la larghezza della colonna in cui è espresso il campo.
Max è una funzione di aggregazione insieme ad altre:
COUNT (nome campo): conta le righe estratte
SUM (nome campo): somma i valori, solo se numerici
AVG (nome campo): estrae il valore medio
MIN (nome campo): estrae il valore minimo
MAX (nome campo): estrae il valore massimo
Float non so bene cosa significhi ma ha a che vedere con il formato dei numeri decimali con virgola variabile come quelli con notazione scientifica. Ad esempio il numero 12345678901 è indicato come 1.23457e+010. Si tratta di una funzione numerica come altre di uso certamente più corrente:
ROUND(campo,num_cifre): restituisce il valore numerico del campo arrotondato al num di cifre
TRUNCATE(campo,num_cifre):restituisce il valore numerico del campo troncato al num di cifre
CEILING(campo): Restituisce il num intero più vicino per eccesso
FLOOR(campo) : Restituisce il num intero più vicino per difetto
MOD(campo1,campo2): restituisce il resto della divisione campo1/campo2
SQRT(campo): restituisce la radice quadrata
POWER (campo1,campo2): restituisce il campo 1 elevato alla potenza campo2
Riguardo a RisultS e RisultN si tratta di due campi diversi nel modo di indicare i valori numerici, numero di caratteri (24 0 15) ed il modo di usare, per separare i decimali, il punto o la virgola. Queste differenze spesso causano variazione dei risultati delle estrazioni. Tempo fa sul forum millewin ci fu un'ampia dissertazione sull'argomento, ma adesso non ricordo bene tutte le differenze per cui mi appello all'aiuto dei Maestri che a suo tempo la animarono. Purtroppo la chiusura del forum ha fatto perdere una fonte inestimabile di utility create da tanti di noi, si è trattato di un FURTO vero e proprio.
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
Sull'uso dei numeri nel SQL ed in Millewin si è tornati più volte, posso riproporre un mio schema.
L'SQL è anglo-americano e riconosce come numeri solo le cifre col punto, se c'è la virgola le considera come una stringa alfabetica. Di conseguenza tutte le operazioni matematiche da + - a > < a comandi come AVG (media) ecc si possono fare solo se si è scritto i dati col punto per i decimali. La visualizzazione non pone naturalmente problemi, è indifferente se sia numero o stringa.
Ciò è vero se si usano le tabelle. Le viste, che sono una rielaborazione delle tabelle fatta dal programma, funzionano in modo leggermente diverso. Nella vista V_ACCERTAMENTI vi sono due campi che mostrano il risultato: Risults che è ciò che hai scritto (col punto o con la virgola), se è col punto lo potrai utilizzare come numero se è con la virgola no, poi vi è il campo Risultn, questo è una rielaborazione del programma che mostra il numero di risultn con la virgola sia che tu l'abbia scritto col punto che con la virgola, (tuttavia internamente lo deve memorizzare col punto) e lo considera numero e su di esso si possono fare tutte le operazioni matematiche normalmente anche se apparentemente ha la virgola.
Millewin ha evidentemente scelto di essere userfrendly privilegiando l'uso italiano della virgola e ha messo a disposizione una vista adatta. Inoltre se si immettono i dati col tastierino numerico automaticamente vengono scritti con la virgola (e perciò con problemi usando le Tabelle).
Quindi a seconda di quello che vuoi ottenere dovrai usare le viste con risultn o risults che permettono di scrivere i numeri come ci pare.
Se vuoi usare le Tabelle o utilizzi sempre il punto per i decimali (MA NOI SIAMO ITALIANI!) o per superare l'ostacolo si può riformattare il numero sostituendo la virgola col punto prima di eseguire l'operazione matematica. Esempio riformattiamo ac_val prima di usare il comando AVG:
AVG (If charindex(',',ac_val)>0 then cast(substring( ac_val,1,(charindex(',',ac_val) - 1 )) + '.' + substring(ac_val, (charindex(',',ac_val) +1 )) AS dec (7,2)) else cast(ac_val AS dec (7,2)) endif)
Al posto di ac_val potrà essere messo il campo numerico necessario.
CHARINDEX('stringa cercata',campo) ritorna la posizione della stringa cercata nel campo, se non c'è ritorna 0 (zero)
SUBSTRING(campo, da quale carattere partire, quanti caratteri vogliamo) ritorna il tratto di stringa indicato
giampiero
L'SQL è anglo-americano e riconosce come numeri solo le cifre col punto, se c'è la virgola le considera come una stringa alfabetica. Di conseguenza tutte le operazioni matematiche da + - a > < a comandi come AVG (media) ecc si possono fare solo se si è scritto i dati col punto per i decimali. La visualizzazione non pone naturalmente problemi, è indifferente se sia numero o stringa.
Ciò è vero se si usano le tabelle. Le viste, che sono una rielaborazione delle tabelle fatta dal programma, funzionano in modo leggermente diverso. Nella vista V_ACCERTAMENTI vi sono due campi che mostrano il risultato: Risults che è ciò che hai scritto (col punto o con la virgola), se è col punto lo potrai utilizzare come numero se è con la virgola no, poi vi è il campo Risultn, questo è una rielaborazione del programma che mostra il numero di risultn con la virgola sia che tu l'abbia scritto col punto che con la virgola, (tuttavia internamente lo deve memorizzare col punto) e lo considera numero e su di esso si possono fare tutte le operazioni matematiche normalmente anche se apparentemente ha la virgola.
Millewin ha evidentemente scelto di essere userfrendly privilegiando l'uso italiano della virgola e ha messo a disposizione una vista adatta. Inoltre se si immettono i dati col tastierino numerico automaticamente vengono scritti con la virgola (e perciò con problemi usando le Tabelle).
Quindi a seconda di quello che vuoi ottenere dovrai usare le viste con risultn o risults che permettono di scrivere i numeri come ci pare.
Se vuoi usare le Tabelle o utilizzi sempre il punto per i decimali (MA NOI SIAMO ITALIANI!) o per superare l'ostacolo si può riformattare il numero sostituendo la virgola col punto prima di eseguire l'operazione matematica. Esempio riformattiamo ac_val prima di usare il comando AVG:
AVG (If charindex(',',ac_val)>0 then cast(substring( ac_val,1,(charindex(',',ac_val) - 1 )) + '.' + substring(ac_val, (charindex(',',ac_val) +1 )) AS dec (7,2)) else cast(ac_val AS dec (7,2)) endif)
Al posto di ac_val potrà essere messo il campo numerico necessario.
CHARINDEX('stringa cercata',campo) ritorna la posizione della stringa cercata nel campo, se non c'è ritorna 0 (zero)
SUBSTRING(campo, da quale carattere partire, quanti caratteri vogliamo) ritorna il tratto di stringa indicato
giampiero
GiampiMaz- Membro Junior
- Messaggi : 122
Punti : 5187
Voti per importanza dei messaggi : 33
Data d'iscrizione : 20.02.11
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
GiampiMaz ha scritto:Sull'uso dei numeri nel SQL ed in Millewin si è tornati più volte, posso riproporre un mio schema.
L'SQL è anglo-americano e riconosce come numeri solo le cifre col punto, se c'è la virgola le considera come una stringa alfabetica. Di conseguenza tutte le operazioni matematiche da + - a > < a comandi come AVG (media) ecc si possono fare solo se si è scritto i dati col punto per i decimali. La visualizzazione non pone naturalmente problemi, è indifferente se sia numero o stringa.
Ciò è vero se si usano le tabelle. Le viste, che sono una rielaborazione delle tabelle fatta dal programma, funzionano in modo leggermente diverso. Nella vista V_ACCERTAMENTI vi sono due campi che mostrano il risultato: Risults che è ciò che hai scritto (col punto o con la virgola), se è col punto lo potrai utilizzare come numero se è con la virgola no, poi vi è il campo Risultn, questo è una rielaborazione del programma che mostra il numero di risultn con la virgola sia che tu l'abbia scritto col punto che con la virgola, (tuttavia internamente lo deve memorizzare col punto) e lo considera numero e su di esso si possono fare tutte le operazioni matematiche normalmente anche se apparentemente ha la virgola.
Millewin ha evidentemente scelto di essere userfrendly privilegiando l'uso italiano della virgola e ha messo a disposizione una vista adatta. Inoltre se si immettono i dati col tastierino numerico automaticamente vengono scritti con la virgola (e perciò con problemi usando le Tabelle).
Quindi a seconda di quello che vuoi ottenere dovrai usare le viste con risultn o risults che permettono di scrivere i numeri come ci pare.
Se vuoi usare le Tabelle o utilizzi sempre il punto per i decimali (MA NOI SIAMO ITALIANI!) o per superare l'ostacolo si può riformattare il numero sostituendo la virgola col punto prima di eseguire l'operazione matematica. Esempio riformattiamo ac_val prima di usare il comando AVG:
AVG (If charindex(',',ac_val)>0 then cast(substring( ac_val,1,(charindex(',',ac_val) - 1 )) + '.' + substring(ac_val, (charindex(',',ac_val) +1 )) AS dec (7,2)) else cast(ac_val AS dec (7,2)) endif)
Al posto di ac_val potrà essere messo il campo numerico necessario.
CHARINDEX('stringa cercata',campo) ritorna la posizione della stringa cercata nel campo, se non c'è ritorna 0 (zero)
SUBSTRING(campo, da quale carattere partire, quanti caratteri vogliamo) ritorna il tratto di stringa indicato
giampiero
no comment!
Tu se' lo mio maestro e 'l mio autore;
tu se' solo colui da cu' io tolsi
lo bello stilo che m'ha fatto onore
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
Admin ha scritto:Ecco (a scopo didattico nel senso che sto cercando di imparare) un rimaneggiamento della query del MAESTRO Sergio:
Select Distinct Cast(cognome As Char(16)), nome, p.sesso, p.nascita, (Year(Today())-Year(p.nascita)) As eta,
(Select Cast(a.ac_val+0 As Dec(4,1)) From cart_accert a Where ( a.codice=p.codice And a.ac_code Like '2609') And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And (a1.data_open > a.data_open)))
BMI, '-' ,
(Select a.data_open From cart_accert a Where ( a.codice=p.codice And a.ac_code Like '2609') And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And (a1.data_open > a.data_open )))
Data,
(IF BMI< '18.5' Then ' SottoPeso ' Else IF ( BMI Between '18.5' And '24.9') Then ' NormoPeso ' Else IF ( BMI Between '25' And '29.9') Then ' Sovrappeso ' Else IF ( BMI Between '30' And '34.9') Then ' Obesità I ' Else IF ( BMI Between '35' And '39.9') Then ' Obesità II ' Else IF ( BMI >'39.9') Then ' Obesità III ' Else ' ? ' Endif Endif Endif Endif Endif Endif)
_commento_
FROM pazienti p , nos_002 n
Where p.codice=n.codice
AND BMI is not null
AND p.Decesso is null
And (n.pa_drevoca Is Null Or n.pa_drevoca > Today())
And p.pa_convenzione = 'S'
And eta Between 40 And 60
AND p.data_open BETWEEN '2011/01/01' AND '2011/12/31'
Order By 1, 2, 4
La query è molto utile, e ringrazio anch'io.
Si può fare in modo che mostri alla fine dell'elenco anche i pazienti a cui non è stato fatto il bmi?
viscardo- Nuovo Membro
- Messaggi : 26
Punti : 4969
Voti per importanza dei messaggi : 10
Data d'iscrizione : 22.05.11
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
viscardo ha scritto:Admin ha scritto:Ecco (a scopo didattico nel senso che sto cercando di imparare) un rimaneggiamento della query del MAESTRO Sergio:
Select Distinct Cast(cognome As Char(16)), nome, p.sesso, p.nascita, (Year(Today())-Year(p.nascita)) As eta,
(Select Cast(a.ac_val+0 As Dec(4,1)) From cart_accert a Where ( a.codice=p.codice And a.ac_code Like '2609') And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And (a1.data_open > a.data_open)))
BMI, '-' ,
(Select a.data_open From cart_accert a Where ( a.codice=p.codice And a.ac_code Like '2609') And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And (a1.data_open > a.data_open )))
Data,
(IF BMI< '18.5' Then ' SottoPeso ' Else IF ( BMI Between '18.5' And '24.9') Then ' NormoPeso ' Else IF ( BMI Between '25' And '29.9') Then ' Sovrappeso ' Else IF ( BMI Between '30' And '34.9') Then ' Obesità I ' Else IF ( BMI Between '35' And '39.9') Then ' Obesità II ' Else IF ( BMI >'39.9') Then ' Obesità III ' Else ' ? ' Endif Endif Endif Endif Endif Endif)
_commento_
FROM pazienti p , nos_002 n
Where p.codice=n.codice
AND BMI is not null
AND p.Decesso is null
And (n.pa_drevoca Is Null Or n.pa_drevoca > Today())
And p.pa_convenzione = 'S'
And eta Between 40 And 60
AND p.data_open BETWEEN '2011/01/01' AND '2011/12/31'
Order By 1, 2, 4
La query è molto utile, e ringrazio anch'io.
Si può fare in modo che mostri alla fine dell'elenco anche i pazienti a cui non è stato fatto il bmi?
Basta cancellare il rigo: AND BMI is not null - invece cambiandolo in: AND BMI is null si elencano i pzienti a cui non è stato mai eseguito un BMI, e poi volendo si può variare il range di età da 40 a 60 anni cambiando il rigo: And eta Between 40 And 60 - ed il periodo di osservazione cambiando: AND p.data_open BETWEEN '2011/01/01' AND '2011/12/31'
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
Admin ha scritto:viscardo ha scritto:Admin ha scritto:Ecco (a scopo didattico nel senso che sto cercando di imparare) un rimaneggiamento della query del MAESTRO Sergio:
Select Distinct Cast(cognome As Char(16)), nome, p.sesso, p.nascita, (Year(Today())-Year(p.nascita)) As eta,
(Select Cast(a.ac_val+0 As Dec(4,1)) From cart_accert a Where ( a.codice=p.codice And a.ac_code Like '2609') And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And (a1.data_open > a.data_open)))
BMI, '-' ,
(Select a.data_open From cart_accert a Where ( a.codice=p.codice And a.ac_code Like '2609') And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And (a1.data_open > a.data_open )))
Data,
(IF BMI< '18.5' Then ' SottoPeso ' Else IF ( BMI Between '18.5' And '24.9') Then ' NormoPeso ' Else IF ( BMI Between '25' And '29.9') Then ' Sovrappeso ' Else IF ( BMI Between '30' And '34.9') Then ' Obesità I ' Else IF ( BMI Between '35' And '39.9') Then ' Obesità II ' Else IF ( BMI >'39.9') Then ' Obesità III ' Else ' ? ' Endif Endif Endif Endif Endif Endif)
_commento_
FROM pazienti p , nos_002 n
Where p.codice=n.codice
AND BMI is not null
AND p.Decesso is null
And (n.pa_drevoca Is Null Or n.pa_drevoca > Today())
And p.pa_convenzione = 'S'
And eta Between 40 And 60
AND p.data_open BETWEEN '2011/01/01' AND '2011/12/31'
Order By 1, 2, 4
La query è molto utile, e ringrazio anch'io.
Si può fare in modo che mostri alla fine dell'elenco anche i pazienti a cui non è stato fatto il bmi?
Basta cancellare il rigo: AND BMI is not null - invece cambiandolo in: AND BMI is null si elencano i pzienti a cui non è stato mai eseguito un BMI, e poi volendo si può variare il range di età da 40 a 60 anni cambiando il rigo: And eta Between 40 And 60 - ed il periodo di osservazione cambiando: AND p.data_open BETWEEN '2011/01/01' AND '2011/12/31'
Scusa Giuseppe e se volessimo fare la stessa cosa con le viste, cioè estrarre i pazienti a cui è stato calcolato il BMI insieme a quelli a cui non è stato calcolato il BMI utilizzando questa tua query che hai postato tempo fa?
SELECT distinct cognome, nome,datavisita, accertamento, risults
FROM v_accertamenti
WHERE accertamento Like 'BMI%'
and ((today()-datanasc)/365) between '40' and '60'
ORDER By cognome, nome,datavisita
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
Lucio Mignone ha scritto:
...........
Scusa Giuseppe e se volessimo fare la stessa cosa con le viste, cioè estrarre i pazienti a cui è stato calcolato il BMI insieme a quelli a cui non è stato calcolato il BMI utilizzando questa tua query che hai postato tempo fa?
SELECT distinct cognome, nome,datavisita, accertamento, risults
FROM v_accertamenti
WHERE accertamento Like 'BMI%'
and ((today()-datanasc)/365) between '40' and '60'
ORDER By cognome, nome,datavisita
Con le viste è diverso perché escludono i pazienti senza alcun BMI. Allora si dovrebbe fare una doppia estrazione del tipo (un po' contorta ma rende l'idea):
SELECT a.cognome, a.nome,a.datanasc, Floor( Days(a.datanasc, Today())/365.25) eta, a.datavisita, a.accertamento, a.risults
FROM v_accertamenti a
WHERE a.accertamento Like 'BMI%'
and eta between '40' and '60'
UNION
Select p.cognome, p.nome, p.datanasc, Floor( Days(a.datanasc, Today())/365.25) eta, CAST('' as date), 'BMI mai eseguito', '00'
From V_pazienti p, V_accertamenti a
WHERE a.codice=p.codice
AND p.codice NOT IN (select a.codice FROM v_accertamenti a WHERE a.accertamento like 'BMI%' )
and eta between '40' and '60'
ORDER BY 6,1,2
Ultima modifica di Admin il Mar 29 Nov 2011 - 1:38 - modificato 1 volta.
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
Studiando tutte le vostre query, tagliando, cucendo e riadattando, ho partorito questa.
Mostra elenco pz con BMI calcolato (la rilevazione più recente), sesso del pz, data della rilevazione BMI, formula automaticamente una valutazione dello stato della massa corporea, ordina l'elenco in base a valore crescente di BMI.
Ok niente di nuovo, ma solo a a scopo didattico che ne pensate? Notate errori grossolani?
Almeno adesso capisco quello che scrivo...
SELECT number (*) As N, cognome, nome, datavisita, datanasc, Years(datanasc, datavisita) As eta, sesso As __sesso__, ' ', accertamento As Tipo_di_Rilevazione, Cast(risults As Dec(4,1)) As Valore_BMI,
(IF ( Valore_BMI< '18.5') Then ' SottoPeso ' Else IF ( Valore_BMI Between '18.5' And '24.9') Then ' NormoPeso ' Else IF (Valore_BMI Between '25' And '29.9') Then ' Sovrappeso ' Else IF (Valore_BMI Between '30' And '34.9') Then ' Obesità 1a classe ' Else IF (Valore_BMI Between '35' And '39.9') Then ' Obesità 2a classe ' Else IF ( Valore_BMI >'39.9') Then ' Obesità 3a classe' Else ' ? ' Endif Endif Endif Endif Endif Endif) As ___Valutazione___
FROM v_accertamenti a
Where accertamento Like '%BMI%' And Not Exists
(Select a1.codice FROM v_Accertamenti a1 Where a1.codice = a.codice And a1.accertamento Like '%BMI%' And a1.datavisita > a.datavisita)
And eta Between 40 And 60
Group By risults, cognome, nome, datanasc, eta, sesso, datavisita, accertamento
Order By 1, 2, 3
PS Per Giuseppe, mi è risultato complicato, tanto da rinunciarci, tentare di aggiungere in questa query (con UNION come da te suggerito) anche i pazienti che NON hanno il BMI calcolato.
Mostra elenco pz con BMI calcolato (la rilevazione più recente), sesso del pz, data della rilevazione BMI, formula automaticamente una valutazione dello stato della massa corporea, ordina l'elenco in base a valore crescente di BMI.
Ok niente di nuovo, ma solo a a scopo didattico che ne pensate? Notate errori grossolani?
Almeno adesso capisco quello che scrivo...
SELECT number (*) As N, cognome, nome, datavisita, datanasc, Years(datanasc, datavisita) As eta, sesso As __sesso__, ' ', accertamento As Tipo_di_Rilevazione, Cast(risults As Dec(4,1)) As Valore_BMI,
(IF ( Valore_BMI< '18.5') Then ' SottoPeso ' Else IF ( Valore_BMI Between '18.5' And '24.9') Then ' NormoPeso ' Else IF (Valore_BMI Between '25' And '29.9') Then ' Sovrappeso ' Else IF (Valore_BMI Between '30' And '34.9') Then ' Obesità 1a classe ' Else IF (Valore_BMI Between '35' And '39.9') Then ' Obesità 2a classe ' Else IF ( Valore_BMI >'39.9') Then ' Obesità 3a classe' Else ' ? ' Endif Endif Endif Endif Endif Endif) As ___Valutazione___
FROM v_accertamenti a
Where accertamento Like '%BMI%' And Not Exists
(Select a1.codice FROM v_Accertamenti a1 Where a1.codice = a.codice And a1.accertamento Like '%BMI%' And a1.datavisita > a.datavisita)
And eta Between 40 And 60
Group By risults, cognome, nome, datanasc, eta, sesso, datavisita, accertamento
Order By 1, 2, 3
PS Per Giuseppe, mi è risultato complicato, tanto da rinunciarci, tentare di aggiungere in questa query (con UNION come da te suggerito) anche i pazienti che NON hanno il BMI calcolato.
Re: SELECT DISTINCT... AIUTO! - evoluta poi in ESTRAZIONE BMI e RCV
Bene, bravo la query è lineare e funziona.
Per inserire i pazienti senza BMI puoi fare:
SELECT cognome, nome, datavisita, a.datanasc, Years(a.datanasc, datavisita) As eta, sesso As __sesso__, accertamento As Tipo_di_Rilevazione, Cast(risults As Dec(4,1)) As Valore_BMI,
(IF ( Valore_BMI< '18.5') Then ' SottoPeso ' Else IF ( Valore_BMI Between '18.5' And '24.9') Then ' NormoPeso ' Else IF (Valore_BMI Between '25' And '29.9') Then ' Sovrappeso ' Else IF (Valore_BMI Between '30' And '34.9') Then ' Obesità 1a classe ' Else IF (Valore_BMI Between '35' And '39.9') Then ' Obesità 2a classe ' Else IF ( Valore_BMI >'39.9') Then ' Obesità 3a classe' Else ' ? ' Endif Endif Endif Endif Endif Endif) As ___Valutazione___
FROM v_accertamenti a
Where accertamento Like '%BMI%' And Not Exists
(Select a1.codice FROM v_Accertamenti a1 Where a1.codice = a.codice And a1.accertamento Like '%BMI%' And a1.datavisita > a.datavisita)
And eta Between 40 And 60
Group By risults, cognome, nome, datanasc, eta, sesso, datavisita, accertamento
UNION
Select distinct p.cognome, p.nome, CAST('' as date), p.datanasc, Years(p.datanasc, today()) As eta, p.sesso, 'BMI non eseguito', CAST('' as dec (4,1)), 'NN'
From V_pazienti p, V_accertamenti a
WHERE a.codice=p.codice
AND p.codice NOT IN (select a.codice FROM v_accertamenti a WHERE a.accertamento like 'BMI%' )
and eta between '40' and '60'
Order By 7,1,2
Usare la numerazione con la funzione UNION diventa problematico per cui ho preferito eliminarla.
Quando si usa UNION è indispensabile che tutte le estrazioni abbiano colonne equivalenti come numero e tipo.
Per inserire i pazienti senza BMI puoi fare:
SELECT cognome, nome, datavisita, a.datanasc, Years(a.datanasc, datavisita) As eta, sesso As __sesso__, accertamento As Tipo_di_Rilevazione, Cast(risults As Dec(4,1)) As Valore_BMI,
(IF ( Valore_BMI< '18.5') Then ' SottoPeso ' Else IF ( Valore_BMI Between '18.5' And '24.9') Then ' NormoPeso ' Else IF (Valore_BMI Between '25' And '29.9') Then ' Sovrappeso ' Else IF (Valore_BMI Between '30' And '34.9') Then ' Obesità 1a classe ' Else IF (Valore_BMI Between '35' And '39.9') Then ' Obesità 2a classe ' Else IF ( Valore_BMI >'39.9') Then ' Obesità 3a classe' Else ' ? ' Endif Endif Endif Endif Endif Endif) As ___Valutazione___
FROM v_accertamenti a
Where accertamento Like '%BMI%' And Not Exists
(Select a1.codice FROM v_Accertamenti a1 Where a1.codice = a.codice And a1.accertamento Like '%BMI%' And a1.datavisita > a.datavisita)
And eta Between 40 And 60
Group By risults, cognome, nome, datanasc, eta, sesso, datavisita, accertamento
UNION
Select distinct p.cognome, p.nome, CAST('' as date), p.datanasc, Years(p.datanasc, today()) As eta, p.sesso, 'BMI non eseguito', CAST('' as dec (4,1)), 'NN'
From V_pazienti p, V_accertamenti a
WHERE a.codice=p.codice
AND p.codice NOT IN (select a.codice FROM v_accertamenti a WHERE a.accertamento like 'BMI%' )
and eta between '40' and '60'
Order By 7,1,2
Usare la numerazione con la funzione UNION diventa problematico per cui ho preferito eliminarla.
Quando si usa UNION è indispensabile che tutte le estrazioni abbiano colonne equivalenti come numero e tipo.
Pagina 1 di 2 • 1, 2
Argomenti simili
» Aiuto su Istruzione SELECT
» aiuto su integrazione estrazione sql
» ---------------aiuto estrazione dati per tesi --------------------------------
» SINTASSI IN POSTGRES DELLE ESPRESSIONI TIPO : IF … IN (SELECT…) THEN … ELSE … ENDIF
» Estrazione per GFR
» aiuto su integrazione estrazione sql
» ---------------aiuto estrazione dati per tesi --------------------------------
» SINTASSI IN POSTGRES DELLE ESPRESSIONI TIPO : IF … IN (SELECT…) THEN … ELSE … ENDIF
» Estrazione per GFR
Pagina 1 di 2
Permessi in questa sezione del forum:
Non puoi rispondere agli argomenti in questo forum.