2016-05-13 35 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

相关问题