【问题标题】:Count number of Not Null fields within a Row [duplicate]计算行中非空字段的数量[重复]
【发布时间】:2012-01-31 03:26:24
【问题描述】:

可能重复:
Count the Null columns in a row in SQL

我已经四处寻找答案,但找不到有效或合适的答案,而且我是 SQL 新手。

我有一个包含活动团队的表格,在其他列中我有team_member_1team_member_2team_member_3team_member_4team_member_5。每个都存储该团队成员的名称,每个团队有不同数量的成员(3 到 5 之间)。

我正在尝试通过计算该行/团队中有多少列/字段是NOT NULL来计算团队中的人数。

如果我的脑袋会变成这样:

Select Count NOT NULL team_member_1, team_member_2, team_member_3,  
                      team_member_4, team_member_5 
from Teams 
where team_id = 5

这当然行不通。然后我想将这个数字乘以 20 英镑(因为活动成本是每人 20 英镑),给我每个团队欠的金额,这将在网站上得到回应。希望一切都有意义。

【问题讨论】:

  • 您的 Teams 表没有很好地规范化 - 如果这很重要,您需要将其重组为具有 teamIdmemberId 和可能的 memberPosition。这将使查询变得更加容易。
  • 请出示您的表格描述\ERD。
  • (是的,我知道可能的重复问题问的是相反的问题,但本质上是一样的......)

标签: sql select null count


【解决方案1】:

如果您的服务器产品支持布尔数据类型并在适当的上下文中将其隐式转换为整数,例如 MySQL 所做的,那么您可以尝试以下模式:

SELECT
  (team_member_1 IS NOT NULL) +
  (team_member_2 IS NOT NULL) +
  (team_member_3 IS NOT NULL) +
  (team_member_4 IS NOT NULL) +
  (team_member_5 IS NOT NULL) AS MemberCount
FROM Teams
WHERE team_id = 5

【讨论】:

    【解决方案2】:

    你应该有一个关系表 TeamMember -> 关系为 1:n \ n:n 的团队。

    然后在您的查询中加入两个表,按团队分组并计算团队成员。

    select t.Id, count(tm.Id)
    from teams t, teams_members tm
    where t.Id = tm.Team_Id
    group by t.Id
    

    【讨论】:

      【解决方案3】:

      恕我直言,这是一个非常糟糕的设计:)

      首先,我会normalize db。如果这样做了,您关于团队成员数量的问题很简单SELECT COUNT(*) ...

      为团队制作一张桌子,一张用于成员,第三张用于将团队成员与团队“联系起来”。

      【讨论】:

        【解决方案4】:

        解决问题的关键是使用特定的 if 函数

        对于 Oracle,它可能是 DECODE

        SELECT 
         DECODE(COL1, null, 0, 1) +
         DECODE(COL2, null, 0, 1) +
         DECODE(COL3, null, 0, 1) +
         DECODE(COL4, null, 0, 1) AS Result
        FROM YOUR_TABLE
        

        对于 MySQL,它可能是 IF

        SELECT 
         IF(COL1 is null, 0, 1) +
         IF(COL2 is null, 0, 1) +
         IF(COL3 is null, 0, 1) +
         IF(COL4 is null, 0, 1) AS Result
        FROM YOUR_TABLE
        

        我你使用的是 SQL Server,你应该使用CASE 语句

        SELECT
            CASE COL1 WHEN IS NULL THEN 0 ELSE 1 END + 
            CASE COL2 WHEN IS NULL THEN 0 ELSE 1 END +
            CASE COL3 WHEN IS NULL THEN 0 ELSE 1 END 
        FROM YOUR_TABLE
        

        【讨论】:

        • 您可以使用所有 3 个案例!
        • +1 适用于几乎所有 DBMS 的第三版。
        • +1/-1 MySQL 没有四参数 IF() 运算符。 CASE WHEN NULL 从不为真。不过,DECODE 示例看起来是正确的。 (Oracle 会将 NULL 视为平等)。
        • 是的,案例应该是:CASE WHEN Col1 IS NULL THEN ...
        • IF() 应该是这样的:IF(Col1 IS NULL, 0, 1)
        【解决方案5】:

        正如其他人指出的那样,这是一个糟糕的设计,您应该尝试规范化。但是,我会尝试这样的事情:

        Select Count(*) from teams where
         (team_id = 5) and
         (team_member_1 is not null or
          team_member_2 is not null or
          team_member_3 is not null or
          team_member_4 is not null or
          team_member_5 is not null)
        

        您至少应该通过创建一个 Team 表和一个 Member 表并将 Member 引用到 Team 来规范化到第一个范式。

        【讨论】:

        • 这将计算 Not Null 列,但会计算至少一个字段不为空的行。
        猜你喜欢
        • 2017-01-08
        • 2021-05-28
        • 2021-08-18
        • 2015-12-17
        • 1970-01-01
        • 2011-08-29
        • 1970-01-01
        • 2014-12-19
        • 1970-01-01
        相关资源
        最近更新 更多