2

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

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

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

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

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

4

4 回答 4

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。

于 2013-03-14T19:12:42.200 回答
1

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

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

于 2013-03-14T19:10:23.937 回答
0

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

于 2013-03-14T19:11:09.630 回答
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

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

于 2013-03-14T19:19:40.783 回答