2016-05-13 76 views
0

我有如下表:SQL代碼在查詢中選擇一個字段每個獨特值1排

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

我需要我的結果讓每個客戶端ID一行,如果該客戶端ID都有一個狀態-1對錶的任何行,那在0值優先的結果應該是:

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

我已經試了又試,看着其他類似的問題在這裏StackExchange,但可以」我似乎得到了我期待的結果。任何幫助表示讚賞。

+0

假設一個客戶具有多行與狀態' - 1'?如果這些行有不同的日期,您將不得不選擇要顯示的行。你如何解決這個問題? – Smandoli

+0

順便說一下,你不打算命名一個字段'日期',是嗎? 「日期」是Access中的專用關鍵字,將其用於名稱是個不錯的主意。 – Smandoli

+0

是的,這只是一個僞表。多個-1值無關緊要,具體日期並不重要 –

回答

1

試圖打破問題成邏輯的步驟,然後嘗試從那裏優化:

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

我會嘗試這種方式:

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

您需要將其粘貼到SQL視圖中,因爲Access的查詢設計界面不會促進這種方法。但是您可以嵌套查詢 - 這是應用此解決方案的一種方法。 – Smandoli

+0

該解決方案丟失沒有'-1'值的客戶端。所以T33C的答案可能會更好。 (不過,我認爲這個人可以工作嗎?) – Smandoli

+0

@Smandoli請解釋一下,如果客戶端只有一個0值,它將會失去它。我跑了一個測試,它返回了預期的數據集。 – JJ32

相關問題