我有一个表(让我们称之为“项目”),其中包含一组名称,组和状态。例如
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 WHEN
和IF EXISTS
,但我无法让它发挥作用。有什么输入吗?
编辑3:
作为整体组状态的所需输出的示例:
Group | OverallStatus
A UNKN
B OFF
答案 0 :(得分:2)
如果你可以建立另一个表,一个简单的解决方案是:
按照您想要的顺序添加另一个包含值的表。
然后,只需构建一个这样的查询:
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)