【问题标题】:SQL get number of columns in a particular row having a particular valueSQL获取特定行中具有特定值的列数
【发布时间】:2013-03-14 18:46:41
【问题描述】:

我知道我可以通过使用 COUNT(*) 函数来获取特定列中具有特定值的行数,但我想找到特定行中具有特定值的列数.关于如何做到这一点的任何建议?

我会发布一个到目前为止我已经尝试过的示例,但我完全迷失了这个......

编辑 1 - 这是一些示例数据和预期结果:

表格 - 跟踪单 | u1 | u1付费 | u2 | u2付费 | u3 | u3付费 | u4 | u4付费 | u5 | u5付费

所以我想做的是,当我使用 trackbill 选择特定行时,我想浏览它的所有列,看看哪些列的值为“false”。因此,如果 u1paid 和 u3paid 是唯一的值为 false 的列,则返回的答案应该是 2。

【问题讨论】:

  • 你能发布一些示例数据和想要的结果吗?查看您的尝试也很有帮助。
  • 我尝试实现 COUNT(),但无法计算列数,当我在网上寻求帮助时,我发现 COUNT()只能用来计算行数,不能计算列数。

标签: sql sqlite count command multiple-columns


【解决方案1】:

我认为你的表结构如下:

TABLE trackbill
( u1     NUMBER(10,2)
, u1paid VARCHAR(10)  -- contains values 'Yes' or 'No'
, u2     NUMBER(10,2)
, u2paid VARCHAR(10)  -- contains values 'Yes' or 'No'
, u3     NUMBER(10,2)
, u3paid VARCHAR(10)  -- contains values 'Yes' or 'No'
, u4     NUMBER(10,2)
, u4paid VARCHAR(30)  -- contains values 'Yes' or 'No'
, u5     NUMBER(10,2)
, u5paid VARCHAR(30)  -- contains values 'Yes' or 'No'
)

所以,要检查uxpaid 列有多少“是”,我们可以编写如下 SQL:

SELECT u1, u1paid, u2, u2paid, u3, u3pai, u4, u4paid, u5, u5paid
       , CASE u1paid WHEN 'Yes' THEN 1 ELSE 0 END
       + CASE u2paid WHEN 'Yes' THEN 1 ELSE 0 END
       + CASE u3paid WHEN 'Yes' THEN 1 ELSE 0 END
       + CASE u4paid WHEN 'Yes' THEN 1 ELSE 0 END
       + CASE u5paid WHEN 'Yes' THEN 1 ELSE 0 END
       AS no_of_paid_columns
  FROM trackbill

由于我不知道 SQLite,我无法为您提供帮助。

【讨论】:

  • 你的答案是一样的,但更好。
  • 哦,谢谢,我不知道。我正在打字,当我点击“发布答案”时,我看到了所有这些答案,不知道哪个是我的!
【解决方案2】:

如果您的列是布尔值,请尝试简单地添加列因此您的计数是 u1paid + u2paid + u3paid + u4paid。您可能需要稍微调整一下,具体取决于语法,但只要错误条目为 0,它就可以成为您计数的一种方式。

如果列不是 bool,您仍然可以对返回 bool 的每个字段进行比较,具体取决于它是否具有您要查找的值,然后添加那些为 true 的。

【讨论】:

  • 您确实先发布了,但上面的答案更详细,所以我接受了那个。不过还是感谢您的回复!
  • 应该接受更好的答案,而不仅仅是谁是第一个。这就是为什么我在看到发布的其他答案后给了它一个赞成票。
【解决方案3】:

最简单的方法是unpivot数据。您可以使用CROSS JOIN 创建虚拟表:

select trackbill,
  count(*) Total
from
(
  select t.trackbill,
    case c.col
      when 'u1paid' then u1paid
      when 'u2paid' then u2paid
      when 'u3paid' then u3paid
      when 'u4paid' then u4paid
      when 'u5paid' then u5paid
    end as data
  from yourtable t
  cross join
  (
    select 'u1paid' as col
    union all select 'u2paid'
    union all select 'u3paid'
    union all select 'u4paid'
    union all select 'u5paid'
  ) c
) src
where data = 'false'
group by trackbill

SQL Fiddle with Demo

【讨论】:

    【解决方案4】:

    你说如果它是垂直格式你已经知道怎么做......

    所以这是你的水平表垂直:

    SELECT Trackbill, u1paid FROM table
    UNION
    SELECT Trackbill, u2paid FROM table
    UNION
    SELECT Trackbill, u3paid FROM table
    UNION
    SELECT Trackbill, u4paid FROM table
    UNION
    SELECT Trackbill, u5paid FROM table
    

    您可以将其用作派生表来编写另一个选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 2020-03-17
      • 2021-10-08
      • 1970-01-01
      相关资源
      最近更新 更多