SQL获取具有特定值的特定行中的列数

时间:2013-03-14 18:46:42

标签: sql sqlite count command multiple-columns

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

我会发布一个我迄今为止尝试过的例子,但我完全迷失了这个......

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

表 - 运单| u1 | u1paid | u2 | u2paid | u3 | u3paid | u4 | u4paid | u5 | u5paid

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

4 个答案:

答案 0 :(得分:3)

我会认为你的表结构如下:

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,因为我不知道。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

最简单的方法是取消数据。您可以使用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

答案 3 :(得分:0)

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

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

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

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