我已经阅读了几个相关问题的答案,但没有一个可以适用于这种情况。
我有一张表TableA
,其中列出了几个组,其得分为:
GROUP|SCORE
Blue | 0
Green| 0
Red | 0
Orange| 0
在另一张表TableB
上,我有每组的部分及其个人得分(状态),它们可以有三个不同的值:
- G (Good)
- A (Average)
- B (Bad)
所以tableB
是:
GROUP|PART|STATUS
Blue | 3H2| A
Blue | 4NQ| G
Blue | W9X| A
Green| 65D| G
Red | 73F| B
Red | 91G| A
我需要通过以下方式更新TableA
上的分数:
G
,则群组得分为3 A
,则群组分数为2 B
,则群组分数为1 我已经花了几天时间来解决这个问题,但我无法找到解决方案。感谢你们。顺便说一下,我正在使用Access 2013。
答案 0 :(得分:2)
正如我在评论中已经提到的:不要冗余地存储分数;它隐含在tableB中。为了直接获取数据库,请引入状态表:
STATUS DESCRIPTION SCORE G Good 3 A Avarage 2 B Bad 1
如果要为每个颜色组选择分数,请使用此查询:
select b.colorgroup, max(s.score) as maxscore
from tableb as b
join status as s on s.status = b.status
group by b.colorgroup;
编写同一查询的两种替代方法:
select
colorgroup,
(
select max(score)
from status as s
where s.status = b.status
) as maxscore
from tableb as b;
和
select b.colorgroup, s.maxscore
from tableb as b
join
(
select status, max(score) as maxscore
from status
group by status
) as s on s.status = b.status;
(顺便说一句:我打电话给你的小组colorgroup
,因为GROUP
是SQL中的保留名称。)
更新您说您无法将表添加到数据库中。因此,您必须不幸地评估查询本身的分数。在标准SQL中,您将使用CASE WHEN
,MS Access不具备此功能。 MS Access提供IIF
代替:
select
colorgroup,
max(iif(status = 'G', 3, iif(status = 'A', 2, 1))) as maxscore
from tableb
group by colorgroup;
如果您甚至必须使用tableA中的列并进行冗余存储,请使用:
update tablea as a
set score =
(
select
max(iif(status = 'G', 3, iif(status = 'A', 2, 1))) as maxscore
from tableb as b
where b.colorgroup = a.colorgroup
);
答案 1 :(得分:0)
在 SQL-Server 中,您可以执行以下操作:
<强> QUERY 强>
update a
set a.SCORE = MaxSTATUS
from #a a
join (select GROUP_, MAX(case when b.STATUS_ = 'G' then 3
when b.STATUS_ = 'A' then 2
when b.STATUS_ = 'B' then 1
end) MaxSTATUS
from #b b
group by GROUP_
) b ON a.GROUP_ = b.GROUP_
select * from #a
示例数据
CREATE TABLE #a
(
GROUP_ NVARCHAR(60),
SCORE INT
)
INSERT INTO #a VALUES
('Blue',0)
,('Green',0)
,('Red',0)
,('Orange',0)
CREATE TABLE #b
(
GROUP_ NVARCHAR(60),
PART NVARCHAR(60),
STATUS_ NVARCHAR(60),
)
INSERT INTO #b VALUES
('Blue','3H2','A')
,('Blue','4NQ','G')
,('Blue','W9X','A')
,('Green','65D','G')
,('Red','73F','B')
,('Red','91G','A')
<强> OUPUT 强>
GROUP_ SCORE
Blue 3
Green 3
Red 2
Orange 0