SQL中的条件输出

时间:2017-02-14 14:33:27

标签: sql ms-access

我有一个表(让我们称之为“项目”),其中包含一组名称,组和状态。例如

Name | Group | Status

FF      A      ON
GG      A      OFF
HH      A      UNKN
ZZ      B      ON
YY      B      OFF

我正在尝试通过获取最相关的状态(按相关性排序:UNKN,OFF,ON)来聚合给定组中所有记录的状态。

编辑1:这些状态仅是示例,其名称和订单可能会在我的应用程序中发生变化,因此应该可以在查询中进行配置。

例如,如果我查询组A的整体状态,则状态应为UNKN,如果我查询组B,则状态应为OFF。

编辑2:组中可能存在相同状态的倍数。例如,两个UNKN记录。

我管理的查询是从一个组中选择所有项目。例如A组:

SELECT Items.[Group], Items.[Status]
FROM Items
WHERE (((Items.[Group])="A"));

产地:

Name | Group | Status

FF      A      ON
GG      A      OFF
HH      A      UNKN

但我无法将其归结为每个群体最相关的单一状态。我曾尝试使用CASE WHENIF EXISTS,但我无法让它发挥作用。有什么输入吗?

编辑3:

作为整体组状态的所需输出的示例:

Group | OverallStatus

A         UNKN
B         OFF

4 个答案:

答案 0 :(得分:2)

如果你可以建立另一个表,一个简单的解决方案是:

按照您想要的顺序添加另一个包含值的表。

enter image description here

然后,只需构建一个这样的查询:

SELECT TOP 1 Table1.*, Table2.VALUE
FROM Table1 INNER JOIN Table2 ON Table1.status = Table2.STATUS
WHERE Table1.group="A"
ORDER BY  Tabla2.VALUE DESC

如果状态更改或添加新状态,或者您需要新订单,只需刷新新表。

修改

根据OP的新信息,查询可以用另一种方式写入。上一个查询会考虑显示table1中的所有记录。

如果您只需要组和“最大”状态,则可以使用以下内容:

SELECT A.group, Table2.STATUS
FROM (SELECT Table1.group, Max(Table2.VALUE) AS MaxVALUE
FROM Table1 INNER JOIN Table2 ON Tabla1.status = Table2.STATUS
GROUP BY Table1.group) as A INNER JOIN Table2 ON A.MaxVALUE= Table2.VALUE;

答案 1 :(得分:1)

使用条件聚合和其他一些逻辑:

select grp,
       switch(sum(iif(status = "UNK", 1 0) > 0, "UNK",   -- any unknowns
              sum(iif(status = "OFF", 1, 0) > 0, "OFF",  -- any offs
              "ON"
             ) as group_status                  
from items
group by grp;

这会计算每个状态的数量,然后使用它来确定整体组状态。你的问题并没有明确规定,但我认为这些规则可以捕捉到你想要做的事情。修改其他规则应该很容易。

答案 2 :(得分:0)

假设 status 列只有三个不同的值,如数据示例所示,您可以尝试以下查询:

SELECT * 
FROM ITEMS
WHERE (GROUP,LENGTH(STATUS)) IN (
    SELECT GROUP,MAX(LENGTH(STATUS))
    FROM ITEMS
    GROUP BY GROUP)

谢谢, 阿穆布巴克

答案 3 :(得分:0)

使用"长度"作为规范,这应该适合Access SQL:

Select * 
From Items 
Where Items.Name = (
    Select Top 1 T.Name 
    From Items As T 
    Where T.Group = Items.Group
    Order By Len(T.Status) Desc)