基于一个“分组依据”下的两个分离列,仅获取与条件匹配的行的SQL查询

基于一个“分组依据”下的两个分离列,仅获取与条件匹配的行的SQL查询,sql,sql-server,Sql,Sql Server,简单的SELECT查询将返回如下数据: 从数据中选择ID、用户、国家/地区、时间记录 ID User Country TimeLogged 1 Samantha SCO 10 1 John UK 5 1 Andrew NZL 15 2 John UK 20 3 Mark UK 10 3 Mark UK

简单的SELECT查询将返回如下数据:

从数据中选择ID、用户、国家/地区、时间记录

ID     User      Country   TimeLogged
1      Samantha  SCO       10
1      John      UK         5
1      Andrew    NZL       15
2      John      UK        20
3      Mark      UK        10
3      Mark      UK        20
3      Steven    UK        10
3      Andrew    NZL       15
3      Sharon    IRL        5
4      Andrew    NZL       25
4      Michael   AUS        5
5      Jessica   USA       30
我想返回按ID分组的每个用户记录的时间总和 但仅适用于同时包含Country=UK和User=Andrew这两个值的ID号

因此,上述示例中的输出为

ID     User      Country   TimeLogged
1      John      UK         5
1      Andrew    NZL       15
3      Mark      UK        30
3      Steven    UK        10
3      Andrew    NZL       15

所以,你已经描述了你需要写的东西,几乎完美但不完全。您的结果表表明您希望Country=UK或User=Andrew,而不是AND

您需要选择并分组,然后包括一个,其中:-

Select ID, User, Country, SUM(Timelogged) as Timelogged from mytable
WHERE Country='UK' OR User='Andrew'
Group by ID, user, country

首先,您需要确定要返回的ID

SELECT ID FROM MyTable WHERE Country='UK' 
INTERSECT
SELECT ID FROM MyTable WHERE [User]='Andrew';
在此基础上,您可以过滤以聚合预期的行

SELECT ID, 
       [User], 
       Country, 
       SUM(Timelogged) as Timelogged 
FROM mytable
WHERE (Country='UK' OR [User]='Andrew')
AND ID IN(  SELECT ID FROM MyTable WHERE Country='UK' 
            INTERSECT
            SELECT ID FROM MyTable WHERE [User]='Andrew')
GROUP BY ID, [User], country;

从添加WHERE子句开始,仅包括国家为英国或用户为安德鲁的行。如果您只需要这些字段对中的ID号(国家=英国和用户=安德鲁),那么在预期结果中,国家为英国和用户安德鲁的行是如何出现的?Isaac-OP错误地描述了他的逻辑。我认为他的意思是或不是AND@iainc,重新阅读OP的要求。仅返回包含Country='UK'和User='Andrew'的ID。不在同一行,但按ID分组。我读取OP的要求。OP的结果表与OP的逻辑相矛盾。如果Andrew和UK,则ID 3 Andrew NZL将不在。重新阅读OP的要求。此查询将返回ID=4 Andrew,这不是OP想要的,因为ID=4不包含Country=UK,ID=3也不包含Country UK,但它在OP的结果表中。但是ID=3包含Andrew。这让人困惑,但这是一个隐含的和按ID分组的方法。太好了!工作起来很有魅力。从未使用过INTERSECT,所以我学到了一些新东西。