2016-05-13 8 views
0

Ich habe eine der folgenden Tabelle:SQL-Code 1 Zeile pro eindeutigem Wert auf ein Feld auszuwählen, die in einer Abfrage

| ClientID | Status | Date  | 
| ---------- | --------- | --------- | 
| 1   | -1  | 3/1/2016 | 
| 1   | 0   | 5/5/2016 | 
| 2   | 0   | 3/21/2016 | 
| 2   | -1  | 4/16/2016 | 
| 2   | 0   | 5/1/2016 | 
| 3   | 0   | 4/10/2016 | 
| 3   | -1  | 5/6/2016 | 
| 4   | 0   | 5/8/2016 | 

ich mein Ergebnis benötigen eine Zeile pro ClientID zu haben, und wenn das ClientID hat einen Status von -1 auf einer Zeile auf dem Tisch, die seinen Vorrang vor einem Wert von 0. Das Ergebnis nimmt sollte:

| ClientID | Status | Date  | 
| ---------- | --------- | --------- | 
| 1   | -1  | 3/1/2016 | 
| 2   | -1  | 4/16/2016 | 
| 3   | -1  | 5/6/2016 | 
| 4   | 0   | 5/8/2016 | 

ich habe versucht und versuchte und sah ähnliche Fragen hier auf Stack, kann aber‘ Ich scheine das Ergebnis zu bekommen, das ich suche. Jede Hilfe wird geschätzt.

+0

Angenommen, ein Kunde mehr als eine Zeile mit dem Status 'hat - 1? Wenn diese Zeilen unterschiedliche Daten haben, müssen Sie auswählen, welche angezeigt werden sollen. Wie lösen Sie das auf? – Smandoli

+0

Übrigens werden Sie kein Feld "Date" nennen, oder? "Datum" ist ein dediziertes Schlüsselwort in Access, und es ist eine schlechte Idee, es für einen Namen zu verwenden. – Smandoli

+0

Ja, das ist nur eine Pseudo-Tabelle. Mehrere -1 Werte spielen keine Rolle, das spezifische Datum ist nicht wichtig. –

Antwort

1

Der Versuch, das Problem in logischen Schritten zu brechen und dann versuchen, von dort zu optimieren:

--Prioritise on Status == -1 
    select * 
    from ClientTable 
    where Status=-1 
    UNION 
--Add any remaining rows, I guess you are only interested in one, not sure which one so chose top one 
    select top 1 * 
    from ClientTable 
    where ClientID not in (
     select ClientID 
     from ClientTable 
     where Status=-1 
    ) 
1

Ich würde es auf diese Weise versuchen:

SELECT tblStatus.ClientID, Max(tblStatus.Date) AS Date 
FROM tblStatus 
WHERE tblStatus.Status= 
    (
    SELECT MIN(Status) 
    FROM tblStatus Status 
    WHERE ClientID=tblStatus.ClientID 
    ) 
GROUP BY tblStatus.ClientID 
+0

Sie müssen dies in der SQL-Ansicht einfügen, da Access 'Query Design Interface diesen Ansatz nicht unterstützt. Aber Sie können eine Abfrage verschachteln - das ist eine Möglichkeit, diese Lösung anzuwenden. – Smandoli

+0

Diese Lösung verliert den Client, der keinen "-1" -Wert hat. Die Antwort von T33C könnte also besser sein. (Ich denke, dass dieser jedoch funktionieren kann) – Smandoli

+0

@Smandoli Bitte erklären Sie, wie es den Fall verlieren würde, wo ein Client nur einen 0-Wert hat. Ich habe einen Test durchgeführt und den erwarteten Datensatz zurückgegeben. – JJ32