2013-03-14 81 views
2

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

我会发布什么,我已经试过到目前为止的例子,但我在这一个完全丧失......

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

桌子 - trabbill | u1 | u1paid | u2 | u2paid | u3 | u3paid | u4 | u4paid | u5 | u5paid

所以我想要做的就是当我选择使用trackbill特定的行,我想通过它的所有列,看看哪些有值“假”。因此,如果u1和u3是唯一具有值false的列,则返回的答案应该是2.

+1

你能张贴一些样本数据和期望的结果吗?看看你试过的东西也很有帮助。 – Taryn 2013-03-14 18:58:52

+0

我试图执行COUNT(*),但我无法得到它来计算列数,当我在网上搜索的帮助,我发现,COUNT(*)可以用来仅计算行数,不列数。 – 2013-03-14 19:03:13

回答

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

+0

你的答案是一样的,但更好。 – thursdaysgeek 2013-03-14 19:14:35

+0

哦,谢谢,我不知道。我正在打字,当我点击“Post Answer”时,我看到了所有这些答案,并对哪一个是我的问题感到困惑! – Rachcha 2013-03-14 19:16:07

+0

工作就像一个绝对的魅力,谢谢! – 2013-03-14 19:26:54

1

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

如果列不BOOL,你仍然可以做的是返回一个布尔值,取决于它是否有您正在寻找的价值每场一个比较,然后添加那些是真实的。

+0

您确实发布了第一个帖子,但上面的答案更详细,所以我接受了该答案。尽管如此,谢谢你的回复! – 2013-03-14 19:27:57

+0

应该接受更好的答案,而不仅仅是谁是第一个。这就是为什么我看到其他答案发布后我给了它一个upvote。 – thursdaysgeek 2013-03-14 21:21:05

0

要做到这一点,最简单的方法是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

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 

您可以使用它作为派生表写入另一个选择。