Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL代码,用于为查询中字段的每个唯一值选择一行_Sql_Vba_Ms Access_Ms Access 2013 - Fatal编程技术网

SQL代码,用于为查询中字段的每个唯一值选择一行

SQL代码,用于为查询中字段的每个唯一值选择一行,sql,vba,ms-access,ms-access-2013,Sql,Vba,Ms Access,Ms Access 2013,我对下表有一个建议: | ClientID | Status | Date | | ---------- | --------- | --------- | | 1 | -1 | 3/1/2016 | | 1 | 0 | 5/5/2016 | | 2 | 0 | 3/21/2016 | | 2 | -1 | 4/16/2016 | | 2

我对下表有一个建议:

| 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  |
我需要我的结果为每个ClientID有一行,如果该ClientID在表中的任何一行上的状态为-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上看了其他类似的问题,但似乎没有得到我想要的结果。感谢您的帮助。

尝试将问题分解为逻辑步骤,然后尝试从中优化:

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

尝试将问题分解为逻辑步骤,然后尝试从中优化:

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

我会这样尝试:

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

我会这样尝试:

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

假设一个客户端有多个状态为-1的行?如果这些行具有不同的日期,则必须选择要显示的日期。你怎么解决这个问题呢?顺便说一下,你不会指定一个字段日期吧?Date是Access中的一个专用关键字,使用它作为名称是个坏主意。是的,这只是一个伪表。多个-1值无关紧要,具体日期并不重要。如果客户机有多行状态为-1?如果这些行具有不同的日期,则必须选择要显示的日期。你怎么解决这个问题呢?顺便说一下,你不会指定一个字段日期吧?Date是Access中的一个专用关键字,使用它作为名称是个坏主意。是的,这只是一个伪表。多个-1值无关紧要,具体日期并不重要。您需要将其粘贴到SQL视图中,因为Access的查询设计界面不支持这种方法。但是你可以嵌套一个查询——这是应用这个解决方案的一种方式。这个解决方案会丢失没有-1值的客户端。因此,T33C的答案可能更好。不过,我认为这一点是可以实现的?@Smandoli请解释一下,如果客户机只有0值,那么它将如何失败。我运行了一个测试,它返回了预期的数据集。这是伟大的,它是完美的工作。这段代码中到底发生了什么?我知道嵌套查询为每个ClientID提取Status的最小值,但是代码中的什么导致每个客户机只选择1行?那是团体票吗?我以前也从未使用过HAVING函数,因此我将仔细阅读。实际上HAVING子句是不必要的,我更新了答案以反映这一点。您需要将其粘贴到SQL视图中,因为Access的查询设计界面不利于此方法。但是你可以嵌套一个查询——这是应用这个解决方案的一种方式。这个解决方案会丢失没有-1值的客户端。因此,T33C的答案可能更好。不过,我认为这一点是可以实现的?@Smandoli请解释一下,如果客户机只有0值,那么它将如何失败。我运行了一个测试,它返回了预期的数据集。这是伟大的,它是完美的工作。这段代码中到底发生了什么?我知道嵌套查询为每个ClientID提取Status的最小值,但是代码中的什么导致每个客户机只选择1行?那是团体票吗?我以前也从未使用过HAVING函数,所以我会仔细阅读。实际上HAVING子句是不必要的,我更新了答案以反映这一点。