计算具有特定值的记录数

时间:2013-01-17 08:58:47

标签: sql count case

我有一张桌子:

表格小组

Id_team         member_1         member_2         member_3
1                Alice            Ben
2                Ben
3                Charles          Alice            Ben
4                Ben              Alice

我需要知道Alice有多少个不同的团队成员(如果她是第一个成员,第二个或第三个成员,则不计算在内)。在我的样本中,正确的答案是2(Ben在Id_team 1和4中,Ben和Charles在Id_team = 3)。谢谢!

4 个答案:

答案 0 :(得分:3)

您必须分别计算每列中的“alices”以确保不同的列

您看来要检查的是“

SELECT
   COUNT(DISTINCT CASE WHEN member_1 = 'Alice' THEN member_1 END) +
   COUNT(DISTINCT CASE WHEN member_2 = 'Alice' THEN member_2 END) +
   COUNT(DISTINCT CASE WHEN member_3 = 'Alice' THEN member_3 END)
FROM tablename
WHERE 'Alice' IN(member_1, member_2, member_3);

更新:已修复COUNT

答案 1 :(得分:2)

好的,所以你想让不同职位的同一支队伍(例如Alice& Ben,Ben和Alice)算作一个。

要执行此操作,请按升序为每个位置的alice命令,并计算结果(这将为您的示例返回2):

SELECT COUNT(*) FROM
(
    SELECT
        least( member_2, member_3) AS l,
        greatest(member_2, member_3) AS g
    FROM teams 
    WHERE 
      member_1 = 'Alice' 
UNION
    SELECT
        least( member_1, member_3) AS l,
        greatest(member_1, member_3) AS g
    FROM teams 
    WHERE 
      member_2 = 'Alice' 
UNION
    SELECT
        least( member_1, member_2) AS l,
        greatest(member_1, member_2) AS g
    FROM teams 
    WHERE 
      member_3 = 'Alice' 
) q
;

请注意,这只能针对3个成员团队的特殊情况进行,因为最少和最大的人可以选择其他两个成员 - 对于4人及以上的成员国,需要更复杂的解决方案。

答案 2 :(得分:2)

您可以尝试连接字段(按字母顺序排序),以便将它们转换为字符串列表。 然后在此列表中运行distinct(因此它将列出所有单独的团队) 然后搜索包含Alice

的字符串数

从这个开始,最难的是“按字母顺序排列”,因为我无法找到任何好的功能,但GROUP_CONCAT有一个单独的SELECTUNION要将字段转换为行应该这样做:

SELECT COUNT(*)
  FROM (
   SELECT DISTINCT team_as_string
     FROM (
       SELECT id tid, GROUP_CONCAT(q ORDER BY q ASC SEPARATOR ',') team_as_string
       FROM (
                 SELECT id, member_1 q FROM teams
           UNION SELECT id, member_2 q FROM teams
           UNION SELECT id, member_3 q FROM teams
           /* add more fields if needed */
       ) c
       GROUP BY tid
     ) b
  ) a  
  WHERE team_as_string LIKE '%Alice%'

我没有检查它的语法错误,但它应该是合理的。测试并给出正确的答案(2)

如果需要,可以为更多成员增强。

当然,如果成员位于单独的连接表中,则可以简化整个group_concat部分。

答案 3 :(得分:1)

  

我需要知道Alice有多少个不同的团队

试试这个:

SELECT 'Alice', COUNT(id_team)
FROM tablename
WHERE 'Alice' IN(member_1, member_2, member_3);

结果:

| ALICE | THECOUNT |
--------------------
| Alice |        3 |

Fiddle Demo.

如果id_team不唯一,请使用COUNT(DISTINCT id_team)