2013-06-23 7 views
5

Ich verwende MS SQL Report Builder 3.0, um einen Bericht für SQL Reporting Services zu generieren. Ich habe einen Datensatz, der die Spalten AppointmentDate, PatientID und InsuranceCarrier enthält. Ich möchte herausfinden, wie viele DISTINCT-Patienten innerhalb eines bestimmten Zeitraums besucht wurden (von AppointmentDate bis EndingDate). Der einzige Zeitpunkt, an dem ein Patient mehr als einmal in der Abfrage anwesend sein sollte, ist, ob er bei einem Wiederholungsbesuch einen anderen Versicherungsträger hatte.SQL Reporting Services, Filtern nach Feld nicht in DISTINCT SELECT-Anweisung?

Wenn ich die folgende Abfrage ausführen:

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

Dann bekomme ich eine Liste der einzelnen Patienten und Versicherungsträger, die in diesem Zeitraum besucht. Da jedes AppointmentDate auch unterschiedlich ist, werden die Patienten leider für jedes individuelle Termindatum dupliziert. Wenn beispielsweise Patient X in diesem Zeitraum zweimal angezeigt wird, werden beide Termine angezeigt.

Wenn ich das AppointmentDate aus meiner SELECT-Anweisung entferne, kann ich unter Dataset-Eigenschaften im Berichts-Generator 3.0 nicht mehr basierend auf dem AppointmentDate-Ausdruck filtern. Ich könnte meine Filterung direkt in der WHERE-Klausel der T-SQL-Anweisung durchführen, aber das bedeutet, dass ich die vom Benutzer eingegebenen Laufzeitberichtsparameter nicht verwenden kann. Dies ist ein Problem, da ich basierend auf Berichtsparametern filtern, die der Benutzer beim Ausführen des Berichts auswählt. Sie geben das Start-AppointmentDate ein und ein "18-Monate-Prior" -Parameter wird als Anfangs- und Endpunkt von AppointmentDates berechnet.

Wie also schließe ich das AppointmentDate ein, damit ich es filtern kann, es aber nicht in meine DISTINCT SELECT einbeziehe, damit es meine Daten korrekt DISTINCTIFICTIERT.

+2

Das ist eine gute Frage und persönlich bin ich daran interessiert, die richtige Antwort (oder welche Anzahl von Arbeitsvorschlägen) dazu zu lernen. Aber über eine Anwendung (ein Reporting-Tool) und insbesondere über die Verwendung dieser Anwendung (im Gegensatz zu ihrer Installation, Konfiguration usw.), glaube ich, dass die Frage nicht wirklich auf DBA.SE gehört, was ist über Dinge, die mit der Serverseite eines DBMS zusammenhängen, sowie über die Konfiguration von allen eingebauten Client-Tools, die das DBMS hat. Daher flehe ich an, dies zu [so] zu migrieren. –

Antwort

0

In diesem speziellen Fall würde ich alle Besuche für den ganzen Tag berücksichtigen. Und anstatt mehrere Begegnungen pro Patient pro Tag anzuzeigen, würde ich für den Bericht als AppointmentDate nur den Tagesabschnitt des AppointmentDates anzeigen. Da die Filterung nicht den genauen Moment des Besuchs benötigt, sondern nur die Tatsache, dass sie stattgefunden hat. Die resultierende Menge würde dann vom Bericht gefiltert werden.

Ihre besondere wählen würde wie folgt aussehen:

-- 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; 

Beispiel Fiddle - beide Ergebnismengen sehen.

Wenn Sie wirklich das gesamte AppointmentDate dem Benutzer zeigen müssen, gebe ich zu, dass ich jetzt keine Idee habe.

1

@FreefallGeek,

Was meinen Sie nicht von Ihnen AppointmentDate filtern können, wenn Sie es von SELECT entfernen? Report Builder ermöglicht es Ihnen, Daten-Set-Filterung zu tun, basierend auf den Benutzer zugeordnete Parameter in der Laufzeit mit Abfrage wie folgt,

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

Mit @beginningofdaterange und @endofdaterange als Berichtsparameter. Dies sollte funktionieren, es sei denn, Sie müssen zusätzliche Filterung durchführen, die AppointmentDate als Ergebnis zurückgeben müssen.

Wenn Sie wirklich das Datum der Verabredung als Ergebnis oder für zusätzliche Filterung zurückgeben müssen, dann ist die nächste Frage, was sollte das AppointmentDate sein, wenn es mehrere Besuche mit demselben Patienten und Versicherungsträger gibt? Der erste Besuch oder der letzte Besuch innerhalb des Datumsbereichs?Wenn das der Fall ist, könnten Sie Gruppe wie dies für die ersten Besuch nutzen,

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

jedoch aus Ihrer Beschreibung, wie es scheint, dass Sie nur die eindeutigen Patienten und Versicherungsträger mit der Fähigkeit, müssen Sie das Datum filtern. Wenn dieses Verständnis korrekt ist, können Sie einfach den Termin mit Benutzereingabeparameter in der WHERE-Klausel ohne SELECT filtern.

Verwandte Themen