复杂的SQL计数查询以获取违规

时间:2018-08-08 09:27:40

标签: sql sql-server

我有一个名为Weapons的表,其中包含weaponIdsweaponType作为列。

| weaponIds   | weaponType  |

 1                       gun
 2                       gun
 3                       gun
 4                       tank
 5                       tank
 6                       bomb
 7                       bomb
 8                       bomb

我还有一个名为WeaponUsage的表,其列分别为weaponIdsuserIds

 | weaponIds   |    userIds  |

     1                  user1
     1                  user2
     2                  user1
     5                  user2
     6                  user2

用户可以使用多种不同类型的武器。但是,用户仅应持有给定类型的一种武器。也就是说,用户不能拥有多个相同类型的武器。

由于我的系统受到攻击,因此我在第二个表中确实有一个实例,其中一个用户拥有多个相同类型的武器。

我想提出一份发现所有此类违规行为的报告。给定一个weaponType,我的结果表应包含针对给定类型的userIds的所有weaponIds和该武器的数量。例如应该报告上面的user1,因为他有2种枪支武器,但是user2很好,因为他有多种武器但类型不同。

如何在单个sql查询中实现此目标?我有sql server作为数据库。

3 个答案:

答案 0 :(得分:1)

请尝试以下查询:

select userid,count(distinct weapontype) from weapons a inner join WeaponUsage b
on a.weaponIds=b.weaponIds 
group by userid
having count(distinct weapontype)>1

答案 1 :(得分:1)

SELECT 
    userIds,
    count(distinct weaponType)
FROM
    Weapons w
INNER JOIN
    WeaponUsage wu
ON
    w.weaponIds = wu.weaponIds
GROUP BY 
    userIds
HAVING 
    count(distinct weaponType) > 1

答案 2 :(得分:1)

这似乎对我分组:

WITH Weapons AS
(
  SELECT * FROM (VALUES
 (1, 'gun'),
 (2, 'gun'),
 (3, 'gun'),
 (4, 'tank'),
 (5, 'tank'),
 (6, 'bomb'),
 (7, 'bomb'),
 (8, 'bomb')) T(weaponId, weaponType)
), WeaponUsage AS
(
  SELECT * FROM (VALUES
 (1, 'user1'),
 (1, 'user2'),
 (2, 'user1'),
 (5, 'user2'),
 (6, 'user2')) T(weaponId, userId)
)
SELECT userId, weaponType, COUNT(*) [#WeaponsOfType]
FROM Weapons W
JOIN WeaponUsage U ON W.weaponId=U.weaponId
GROUP BY userId, weaponType
HAVING COUNT(*)>1

结果:

userId   weaponType   #WeaponsOfType
------   ----------   --------------
user1    gun          2