2016-05-06 17 views
1

Ich verwalten eine landesweite Anwendung und verwenden Tableau, um Visualisierungen von Daten zu erstellen.SQL Server 2012 Max. Datum in Unterabfrage in einer Join-Tabelle

Ich wurde beauftragt, eine Visualisierung zu erstellen, die zeigt, wie viel Zeit zwischen den Kontakteinträgen und heute verstreicht (Case Note Dates). Ich weiß, wie das maximalen Fall Note Datum im Fall Notentabelle zu isolieren:

Select 
    [Case_Master_ID], 
    [Case_Note_Date], 
    [Case_Note_Category_Desc], 
    [Case_Note_Summary_Narr] 
From 
    buCase_Note 
Where 
    Case_Note_Date = (Select MAX(Case_Note_Date) 
         From buCase_Note) 

Diese Abfrage wird mir zeigen, dass max Fall in der Tabelle von heute stellt fest. Das Problem ist, dass ich die Max-Case-Note für alle Teilnehmer anzeigen muss, nicht nur für die von heute. Die ursprüngliche Abfrage, die ich verwendet haben Fall zu betrachten, stellt fest, ist:

Select 
    vc.[_Case Master ID], 
    vc.[_Caseload Assignment Current], 
    vc.[_Participant Name], 
    vc.[Case Status], 
    vc.[Reporting Structure Level 4], 
    vc.[Reporting Structure Level 5], 
    vc.[Application Date], 
    vc.[Eligibility Date], 
    vc.[Eligibility Determination Extension Date], 
    vc.[Eligibility Extended To Date], 
    vc.[Days in Application], 
    cn.[Case_Note_Date], 
    cn.[Case_Note_Category_Desc], 
    cn.[Case_Note_Summary_Narr] 
From 
    biVR_Cases vc 
Left outer Join 
    buCase_Note cn ON cn.Case_Master_ID = vc.[_Case Master ID] 

ich biVR_Cases auf der linken Seite zu halten, müssen alle zeigen die offenen Kunden. Dann muss ich der Fallnotiz-Tabelle beitreten und für jeden Teilnehmer möchte ich ihr Max-Case-Notierungsdatum anzeigen. Als ich das Ende der obigen Abfrage hinzuzufügen:

Where cn.[Case_Note_Date] = (
    Select 
     MAX(cn.Case_Note_Date) 
    From buCase_Note) 

ich die folgende Fehlermeldung erhalten, ist SSMS 2012:

Ein Aggregat nicht in der WHERE-Klausel erscheinen kann, wenn es in einer Unterabfrage ist enthalten in einer HAVING-Klausel oder einer Auswahlliste, und die aggregierte Spalte ist eine äußere Referenz.

Ich suche die bi Tabelle auf der linken Seite, während erfolgreich im Falle Notentabelle Beitritt behalten und nur der jüngste Fall Note pro Teilnehmer zu bringen.

Hinzufügen von Details: Natürlich ist Hier ist ein Beispiel von Daten, die ich erhalten, wenn Sie die folgende Abfrage ausgeführt wird:

Select 
vc.[_Case Master ID], 
vc.[_Caseload Assignment Current], 
vc.[_Participant Name], 
cn.[Case_Note_Date], 
From biVR_Cases vc 
LEFT outer JOIN buCase_Note cn ON vc.[_Case Master ID] = cn.Case_Master_ID 

_Caseload Belegung aktueller Test-Teilnehmername Casenote Datum -Test Ratgeber Teilnehmer A 29. September 2010 23. September 2010 30. August 2010 30. Juni 2010 1. Juni 2010

Die Bi-Tabelle enthält Teilnehmerinformationen wie Name, Anwendung, Fall-Master-ID, etc. Die Caseinetabelle enthält auch die Case-Master-ID und damit den Join. Es enthält auch die Daten, für die jeder Eintrag erstellt wird. Für den obigen Datensatz versuche ich, nur den letzten Fall für jeden Teilnehmer einzutragen. Ich habe nur 1 in das obige Beispiel aufgenommen, aber wir haben über 15.000. Jeder Teilnehmer wird viele Fallnotizen haben. Ich versuche, die obere Fallnotiz zu erfassen, damit ich den Datumunterschied zwischen der letzten Fallnotiz und heute für jeden Teilnehmer berechnen kann. Wenn ich hinzufüge:

Es zeigt nur die obere oder maximale casennote für Teilnehmer, die eine Kaseinnote heute erstellt hatten. Anstatt die maximale Fallzahl in der Caseinetabelle anzuzeigen, benötige ich die maximale Fallzahl pro Teilnehmer. Ich hoffe, das macht mehr Sinn.

+0

Sie sollten einige Daten anzeigen. Ihr MAX (cn.Case_Note_Date) gibt nur eine Daten von buCase_Note zurück, nicht eine pro [_Case Master ID] – Chuck

Antwort

1

sind Sie könnte so etwas wie versuchen, was ich unten enthalten. Ohne tatsächliche Daten weiß ich nicht, ob es für Sie effizient genug ist, aber es sollte funktionieren. Wenn Sie jedoch eine bessere Antwort bekommen, würde ich es gerne wissen.

Select vc.[_Case Master ID], 
vc.[_Caseload Assignment Current], 
vc.[_Participant Name], 
vc.[Case Status], 
vc.[Reporting Structure Level 4], 
vc.[Reporting Structure Level 5], 
vc.[Application Date], 
vc.[Eligibility Date], 
vc.[Eligibility Determination Extension Date], 
vc.[Eligibility Extended To Date], 
vc.[Days in Application], 
cn.[Case_Note_Date], 
cn.[Case_Note_Category_Desc], 
cn.[Case_Note_Summary_Narr] 
From biVR_Cases vc 
LEFT outer JOIN 
    (SELECT Case_Master_ID, Case_Note_Date, Case_Note_Category_Desc, Case_Note_Summar_Narr, 
      ROW_NUMBER() OVER (PARTITION BY Case_Master_ID ORDER BY Case_Note_Date DESC) as RowNum FROM buCase_Note) cn 
    ON cn.Case_Master_ID = vc.[_Case Master ID] AND cn.RowNum=1 
+0

Wow, das hat perfekt funktioniert. Ich würde gerne eine Erklärung der Logik hören, aber ich möchte nicht mehr von Ihrer Zeit nehmen. Vielen Dank! – Mike

+0

Sie könnten versuchen, auf ROW_NUMBER() und die OVER-Klausel zu lesen. Die Grundidee ist, dass dies jedem Datensatz mit derselben Case_Master_ID eine Nummer in absteigender Reihenfolge von Case_Note_Date gibt. Das letzte Datum für jede Case_Master_ID hat einen RowNum-Wert von 1. Ich behaupte nicht, dass es die effizienteste Methode ist, aber es funktioniert. –

0

Entfernen Sie die cn. aus der Zeile MAX(cn.Case_Note_Date). Sie möchten keine Spalte aus der Hauptabfrage referenzieren. Sie möchten nur eine Case_Note_Date von buCase_Note auswählen.

So ist die ganze Abfrage

Select 
vc.[_Case Master ID], 
vc.[_Caseload Assignment Current], 
vc.[_Participant Name], 
vc.[Case Status], 
vc.[Reporting Structure Level 4], 
vc.[Reporting Structure Level 5], 
vc.[Application Date], 
vc.[Eligibility Date], 
vc.[Eligibility Determination Extension Date], 
vc.[Eligibility Extended To Date], 
vc.[Days in Application], 
cn.[Case_Note_Date], 
cn.[Case_Note_Category_Desc], 
cn.[Case_Note_Summary_Narr] 
From biVR_Cases vc 
LEFT outer JOIN buCase_Note cn ON cn.Case_Master_ID = vc.[_Case Master ID] 
Where cn.[Case_Note_Date] = (Select 
MAX(Case_Note_Date) 
From buCase_Note) 
+0

Hallo J. Kasper, Danke für die schnelle Antwort. Die vorgeschlagene Anpassung hat die Abfrage durchlaufen. Ich habe immer noch das gleiche Problem wie zuvor, aber es zieht immer noch nur Fallnotizen von heute. Gibt es eine andere Möglichkeit, die aktuellste Fallnotiz für jeden Teilnehmer zu erhalten, selbst wenn die letzte Fallnotiz vor 4 Monaten war? Nochmals vielen Dank, dass Sie sich die Zeit genommen haben, sich das mal anzusehen. – Mike

+0

@Mike Können Sie bitte die Definition der zwei Tabellen und einige Beispieldaten zur Verfügung stellen? Es wäre viel einfacher, eine Lösung zu finden –

+0

Ich fügte Details zu meiner ursprünglichen Frage hinzu. Es sieht so aus, als ob es die Excel-Exportformatierung nicht benötigt. Im Wesentlichen wird der Teilnehmer eine 1 zu viele Beziehung mit Casennotes haben. 1 Teilnehmer und viele Casennotes im Laufe der Zeit. Das Ziel besteht darin, die obere oder die maximale Fallzahl zu isolieren, so dass ich eine Datumsunterschiedsberechnung zwischen dem aktuellsten Fallnotizdatum und dem heutigen Tag durchführen kann, unabhängig davon, was heute wann ausgeführt wird. – Mike