代码之家  ›  专栏  ›  技术社区  ›  Vicky

获取冲突的复杂SQL计数查询

  •  0
  • Vicky  · 技术社区  · 6 年前

    我有张叫的桌子 Weapons 其中包含 weaponIds weaponType 作为列。

    | weaponIds   | weaponType  |
    
     1                       gun
     2                       gun
     3                       gun
     4                       tank
     5                       tank
     6                       bomb
     7                       bomb
     8                       bomb
    

    我还有一张桌子叫 WeaponUsage 列为 武器装备 userIds .

     | weaponIds   |    userIds  |
    
         1                  user1
         1                  user2
         2                  user1
         5                  user2
         6                  user2
    

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

    因为我的系统被破坏了,所以我在第二个表中有一些实例,其中一个用户有多个相同类型的武器。

    我想做一份报告,找出所有这些违规行为。给定一个 武器类型 ,我的结果表应包含所有 用户名 反对 武器装备 特定类型和武器数量。例如,上面的用户1应该报告,因为他有2种类型的枪,但是用户2可以,因为他有多种武器,但类型不同。

    如何在单个SQL查询中实现这一点?我的数据库是SQL Server。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Fahmi    6 年前

    尝试以下查询:

    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
    
        2
  •  1
  •   Rahul Jain    6 年前
    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
    
        3
  •  1
  •   Paweł Dyl    6 年前

    在我看来,这就像分组:

    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