2017-12-11 5 views
0

Ich verwende SSMS, SQL Server 2012 abzufragen. Ich brauche den Datensatz aus der NPH-Tabelle mit dem frühesten STARTDATE. Wenn ich einen Client mit Zeilen mit demselben Startdatum habe, bekomme ich eine Zeile. Aber für Kunden mit Zeilen mit unterschiedlichen Startdaten bekomme ich überhaupt keine Ergebnisse. Warum bringt es das min (Startdatum) nicht aus der Tabelle PLACEMENTHISTORY zurück?MIN (DATE) funktioniert nicht in SQL Server

select distinct lsf.CLIENTNUMBER 
,nph.ENDDATE 
,nph.STARTDATE 
from legalstatusform lsf 
left join PLACEMENTHISTORY nph on nph.CLIENTNUMBER = lsf.clientnumber 
and (nph.STARTDATE = (select min(startdate) from PLACEMENTHISTORY x 
       where x.CLIENTNUMBER = nph.CLIENTNUMBER)) 
where nph.ENDDATE >= '2017-05-01' 
and nph.ENDDATE <= '2017-05-31' 
and nph.CLIENTNUMBER = '2001' 
group by lsf.CLIENTNUMBER, lsf.ENDDATE, nph.STARTDATE, nph.ENDDATE 

Diese Logik gibt mir keine Ergebnisse aller

Wenn ich die min (startdate) Logik Kommentar aus, bekomme ich 3 Zeilen von Daten für diesen Client. mit den Startdaten vom 31.01.2017, 11.04.2017 und 10.05.2017. Also, mit der min (Startdatum) Logik, warum bekomme ich NICHT nur Zeile 1 mit dem 31.01.2017 Startdatum?

+0

Es kein Ergebnis zurückgeben kann, weil 'MIN' Unterabfrage für diesen Benutzer ein anderes Datum zurückkehrt (nicht einen dieser drei) ... – SatanDmytro

+0

Recht , Duh. Ich habe falsch gesprochen. Ich sollte das Datum 5.10.2017 bekommen, aber keine Ergebnisse, oder? –

Antwort

0

Anstatt eine Unterabfrage zu verwenden (und die Tabelle zweimal zu analysieren), versuchen Sie es mit einem CTE. Das Sortieren kann am Ende, hängt von Ihrer Indizierung genauso teuer sein:

WITH CTE AS(
    SELECT lsf.CLIENTNUMBER, 
      nph.ENDDATE, 
      nph.STARTDATE, 
      ROW_NUMBER() OVER (PARTITION BY lsf.CLIENTNUMBER ORDER BY nph.STARTDATE) AS RN 
    FROM legalstatusform lsf 
    LEFT JOIN PLACEMENTHISTORY nph ON nph.CLIENTNUMBER = lsf.clientnumber 
    WHERE nph.ENDDATE >= '2017-05-01' 
     AND nph.ENDDATE <= '2017-05-31' 
     AND nph.CLIENTNUMBER = '2001' 
    GROUP BY lsf.CLIENTNUMBER, lsf.ENDDATE, nph.STARTDATE, nph.ENDDATE) 
SELECT * 
FROM CTE 
WHERE RN = 1; 
+0

Das funktioniert und ich habe noch nie ein CTE verwendet.Jetzt mein Problem ist, dass dieser Code in einen Bericht in SSRS gehen wird und das Enddatum ist ein deklarierter Parameter, der damit nicht arbeitet. Kann ich einen deklarierten Parameter in einem CTE verwenden? –

+0

Ja, benutze es einfach so, wie du es normalerweise in der WHERE-Klausel im CTE tun würdest. – Larnu

+0

Ich habe das versucht und es hat nicht funktioniert, aber ich fand einen anderen Beitrag, der sagt, dass Sie ein Semikolon danach hinzufügen müssen und es funktioniert jetzt ... wooohooo, danke für Ihre Hilfe! –

0

select distinct ist fast nie angemessen mit group by.

Ihr Problem sind die Bedingungen in der where Klausel. Dadurch wird die äußere Verbindung zu einer inneren Verbindung. Versuchen Sie folgendes:

select distinct lsf.CLIENTNUMBER, nph.ENDDATE, nph.STARTDATE 
from legalstatusform lsf left join 
    PLACEMENTHISTORY nph 
    on nph.CLIENTNUMBER = lsf.clientnumber and 
     nph.STARTDATE = (select min(startdate) 
         from PLACEMENTHISTORY x 
         where x.CLIENTNUMBER = nph.CLIENTNUMBER) 
         ) and 
     nph.ENDDATE >= '2017-05-01' and 
     nph.ENDDATE <= '2017-05-31' 
where lsf.CLIENTNUMBER = '2001'; 

Hinweise:

  • Sie die Bedingungen müssen möglicherweise auf ENDDATE in der Unterabfrage.
  • Ich würde Fensterfunktionen anstelle dieser Form der Abfrage.
  • Wenn CLIENTNUMBER eine Nummer ist, dann sollte '2001' keine Anführungszeichen haben.
+0

Können Sie bitte erklären, was Ihr 2. Aufzählungspunkt bedeutet? I –

+0

Der Code, den Sie mir gaben, gibt mir ein Ergebnis, aber ENDDATE und STARTDATE sind NULL –

+0

@SheriAnderson. . . Überhaupt nicht überraschend. Möglicherweise möchten Sie auch nach Datum in der Unterabfrage filtern. –

0

Weil Ihre Unterabfrage mit der MIN() nicht diese Bedingung:

where nph.ENDDATE >= '2017-05-01' 
and nph.ENDDATE <= '2017-05-31' 

Run nur die Unterabfrage

select min(startdate) from PLACEMENTHISTORY 
where x.CLIENTNUMBER = '2001' 

Und sehen, ob die Zeile mit der MIN() startdate entspricht den Filtern in Ihrer äußeren Abfrage.

+0

DANKE! Ich fügte hinzu und x.ENDDATE> = '2017-05-01' \t \t \t \t \t und x.ENDDATE <= '2017-05-31' und es funktioniert jetzt! Ich schätze Ihre Hilfe! –

+0

Darn es. Es funktioniert für das Schreiben dieser Abfrage, aber diese Abfrage befindet sich in einem SSRS-Bericht und meine Daten sind Parameter. Anscheinend kann ich deklarierte Parameter in einer Unterabfrage nicht verwenden? Wenn ich @StartDate für den Parameter hinzufüge, erhalte ich wieder keine Ergebnisse. Irgendwelche Ideen? –

+0

Nein, tut es nicht und ich sehe was du sagst, aber ich brauche das min (startdatum) innerhalb der Daten als Parameter. –

Verwandte Themen