繁体   English   中英

MS Access-通过汇总功能进行选择

[英]MS Access - Selecting via an aggregate function

我有下表。 我想做两件事:我想为具有多个“活动条目”的所有人员选择所有行。

PersonName  Address Active  DateUpdated
Adam    Paris   False   09/08/2018
Adam    Dubai   True    17/02/2018
Brendan New York    False   17/02/2018
John    Dublin  True    17/02/2018
John    London  True    09/02/2018
Mike    Miami   False   10/02/2018
Mike    Singapore   False   01/02/2018
Mike    New York    True    01/03/2018
Susan   Los Angeles True    19/02/2018
Susan   Las Vegas   True    17/01/2018
Zara    Berlin  True    05/09/2018
Zara    Madrid  True    12/07/2018
Zara    Houston False   12/09/2018

查询:

select PersonName,Count(PersonName)
from tempTableTest where Active=True
group by PersonName

PersonName  Expr1001
Adam    1
John    2
Mike    1
Susan   2
Zara    2

因此,我的结果表应该具有PersonName = John,Susan或Zara的所有行(因为每行在Active = True处都有多个条目)。 我希望它看起来像这样-

PersonName  Address DateUpdated Active
John    London  09/02/2018  True
John    Dublin  17/02/2018  True
Susan   Las Vegas   17/01/2018  True
Susan   Los Angeles 19/02/2018  True
Zara    Berlin  05/09/2018  True
Zara    Madrid  12/07/2018  True
Zara    Houston 12/09/2018  False

我也想更新Active = False,如果有意义的话,DateUpdated <> Max(DateUpdated)。 因此对于John来说,将09/02/2018的行设置为False(因为存在17/02/2018)对于Susan 17/01/2018的行应设置为False And Zara the 05/09/2018 and 12/07/2018应设置为False。

有人可以帮忙吗? (将不胜感激,在此先感谢!)。

尝试加入一个子查询,该子查询仅限制具有多个活动条目的匹配名称:

SELECT t1.*
FROM tempTableTest t1
INNER JOIN
(
    SELECT PersonName
    FROM tempTableTest
    WHERE Active = True
    GROUP BY PersonName
    HAVING COUNT(*) > 1
) t2
    ON t1.PersonName = t2.PersonName

您可以使用EXISTS子句来测试是否存在特定条件:

SELECT t.*
FROM tempTableTest t
WHERE EXISTS(
      SELECT 1 
      FROM tempTableTest s 
      WHERE s.Active=True AND s.PersonName = t.PersonName
      GROUP BY PersonName 
      HAVING Count(*) > 1
)

您可以使用EXISTS

SELECT t.*
FROM tempTableTest t
WHERE EXISTS (SELECT 1 
              FROM tempTableTest t1 
              WHERE t1.PersonName = t.PersonName AND t1.Active = True AND t1.Address <> t.Address
             );

这是一个更新查询。

UPDATE 
    t52293469 AS T 
SET 
    T.Active = False, T.PersonName = "a", T.DateUpdated = Now()
WHERE 
(
    ((T.Active)=True) 
    AND ((Exists (SELECT 1 
                  FROM t52293469 t1 
                  WHERE t1.PersonName = t.PersonName AND t1.Active = True AND t1.DateUpdated >t.DateUpdated
    ))=True)
);

那会更新约翰,苏珊和扎拉

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM