2013-06-23 9 views
5

Sto utilizzando MS SQL Report Builder 3.0 per generare un report per SQL Reporting Services. Ho un set di dati che include le colonne AppointmentDate, PatientID e InsuranceCarrier. Voglio scoprire il numero di pazienti DISTINCT che sono stati visitati entro un certo periodo di tempo (dall'inizio dell'appuntamento fino al termine dell'appuntamento). L'unica volta in cui un paziente dovrebbe essere presente più di una volta nella query è se avessero una compagnia assicurativa diversa in una visita di ripetizione.SQL Reporting Services, filtro sul campo non presente nell'istruzione DISTINCT SELECT?

Se eseguo la seguente query:

SELECT DISTINCT AppointmentDate, PaientID, InsuranceCarrier 
FROM Encounters 
WHERE AppointmentDate >= @beginningofdaterange 
AND AppointmentDate <= @endofdaterange 

tanto sono un elenco di ogni paziente e l'assicurazione vettore che ha visitato in quel intervallo di date. Sfortunatamente, poiché ogni AppointmentDate è anche distinto, i pazienti vengono duplicati per ogni singola data dell'appuntamento. Ad esempio, se il paziente X si presenta due volte in quel lasso di tempo specificato, mostrerà entrambi gli appuntamenti.

Se rimuovo AppointmentDate dalla mia istruzione SELECT, quindi in Proprietà dataset nel Generatore report 3.0 non riesco a filtrare in base all'espressione AppointmentDate. Potrei fare il mio filtro direttamente nella clausola WHERE dell'istruzione T-SQL, ma ciò significa che non posso utilizzare i parametri del rapporto di runtime immessi dall'utente. Questo è un problema perché sto filtrando in base ai parametri del rapporto che l'utente seleziona quando esegue il rapporto. Inseriscono l'AppointmentDate iniziale e un parametro "18 mesi prima" viene calcolato come AppointmentDates iniziale e finale da filtrare.

Quindi, come includere l'AppointmentDate in modo che possa filtrare con esso, ma non includerlo nel mio DISTINCT SELECT in modo che DISTINCTifies correttamente i miei dati.

+2

Questa è una buona domanda e personalmente sono interessato ad apprendere la risposta giusta (o qualsiasi numero di suggerimenti di lavoro) ad esso. Ma, trattandosi di un'applicazione (uno strumento di segnalazione) e, più specificamente, di come usare quell'applicazione (al contrario della sua installazione, configurazione, ecc.), Credo che la domanda non appartenga realmente a DBA.SE, che è su cose relative al lato server di un DBMS, nonché sulla configurazione di qualsiasi strumento client integrato che il DBMS abbia. Pertanto, sto segnalando di migrare questo a [così]. –

risposta

0

In questo caso particolare, terrei conto di tutte le visite per l'intera giornata. E invece di visualizzare più incontri per paziente al giorno, andrei a visualizzare per il report come AppointmentDate solo la parte del giorno dello stesso AppointmentDate. Poiché il filtraggio potrebbe non richiedere il momento esatto della visita, ma solo il fatto che sia avvenuto. Il set risultante verrà quindi filtrato dal report.

vostro particolare di selezione sarà simile alla seguente:

-- small modification (take encounters by entire day): 
SELECT DISTINCT 
    CAST(e.AppointmentDate as Date) as AppointmentDateDay, -- the day of the visit 
    e.PatientID, 
    e.InsuranceCarrier, 
    COUNT(e.Id) as CntVisits -- display them if you'd like 
FROM Encounters as e 
WHERE AppointmentDate >= '20130624 10:00:00' 
AND AppointmentDate <= '20130625 18:00:00' 
GROUP BY PatientID, InsuranceCarrier, CAST(e.AppointmentDate as Date) 
ORDER BY PatientId; 

Esempio Fiddle - vedere entrambi i set di risultati.

Se è davvero necessario mostrare l'intero AppointmentDate all'utente, ammetto che non ho un'idea ora.

1

@FreefallGeek,

Che cosa si intende per Non è possibile filtrare AppointmentDate se si rimuove dal SELEZIONE? Report Builder consente di effettuare il filtraggio dei set di dati in base al parametro assegnato all'utente in fase di esecuzione con query come questa,

SELECT DISTINCT PaientID, InsuranceCarrier 
FROM Encounters 
WHERE 
    AppointmentDate >= @beginningofdaterange 
    AND AppointmentDate <= @endofdaterange 

Con @beginningofdaterange e @endofdaterange come parametro di report. Questo dovrebbe funzionare a meno che non sia necessario eseguire ulteriori filtri che richiedano di restituire AppointmentDate come risultato.

Se è davvero necessario restituire la data dell'appuntamento come risultato o per un ulteriore filtraggio, la domanda successiva è quale dovrebbe essere l'AppointmentDate in caso di visite multiple con lo stesso paziente e assicuratore? La prima visita o l'ultima visita all'interno dell'intervallo di date?Se questo è il caso, è possibile utilizzare gruppo da come questo per prima visita,

SELECT Min(AppointmentDate) AS FirstAppointmentDate, PaientID, InsuranceCarrier 
FROM Encounters 
WHERE 
    AppointmentDate >= @beginningofdaterange 
    AND AppointmentDate <= @endofdaterange 
GROUP BY PaientID, InsuranceCarrier 
ORDER BY AppointmentDate 

Tuttavia, dalla tua descrizione, sembra che hai solo bisogno il paziente distinto e vettore di assicurazione con la capacità di filtrare la data. Se questa comprensione è corretta, puoi semplicemente filtrare l'appuntamento con il parametro di input dell'utente nella clausola WHERE senza SELECT.

Problemi correlati