Обсуждение: Count
I have a table with four columns that will either be null or hold the value 'true'. I want to obtain the count of these columns, within a particular row, that have 'true' as a value (0 to 4). I have attempted the Select count method but it seems that I need something more. If anyone has any thoughts it would be much appreciated. Bob
Bob Pawley wrote:
> I have a table with four columns that will either be null or hold the
> value 'true'.
>
> I want to obtain the count of these columns, within a particular row,
> that have 'true' as a value (0 to 4).
>
> I have attempted the Select count method but it seems that I need
> something more.
>
> If anyone has any thoughts it would be much appreciated.
>
> Bob
Something like this?
create table t (id int, w bool, x bool, y bool, z bool);
insert into t values
(1,null,null,'t','t'),
(1,null,'t','t',null),
(2,'t',null,'t',null),
(2,'t',null,'t',null),
(3,null,'t','t','t'),
(4,'t','t','t','t');
select id,
sum(case when w is null then 0 else 1 end) as w,
sum(case when x is null then 0 else 1 end) as x,
sum(case when y is null then 0 else 1 end) as y,
sum(case when z is null then 0 else 1 end) as z
from t
group by id
order by id;
id | w | x | y | z
----+---+---+---+---
1 | 0 | 1 | 2 | 1
2 | 2 | 0 | 2 | 0
3 | 0 | 1 | 1 | 1
4 | 1 | 1 | 1 | 1
?
On Wed, 2008-01-23 at 10:50 -0800, Bob Pawley wrote:
> I have a table with four columns that will either be null or hold the value
> 'true'.
>
> I want to obtain the count of these columns, within a particular row, that
> have 'true' as a value (0 to 4).
>
> I have attempted the Select count method but it seems that I need something
> more.
>
> If anyone has any thoughts it would be much appreciated.
1. what did you do?
2. what did you see?
3. what did you expect?
Regards,
Jeff Davis
Bob Pawley wrote:
> I have a table with four columns that will either be null or hold the
> value 'true'.
Any reason why the NULL values aren't instead FALSE? NULL != FALSE.
> I want to obtain the count of these columns, within a particular row,
> that have 'true' as a value (0 to 4).
SELECT
(CASE WHEN t.col1 = TRUE THEN 1 ELSE 0 END)
+ (CASE WHEN t.col2 = TRUE THEN 1 ELSE 0 END)
+ (CASE WHEN t.col3 = TRUE THEN 1 ELSE 0 END)
+ (CASE WHEN t.col4 = TRUE THEN 1 ELSE 0 END)
AS true_count FROM your_table AS t;
I'm sure there's a more clever way than that, though.
> I have attempted the Select count method but it seems that I need
> something more.
That would only be useful if you were counting across rows (aggregating).
b
> -----Original Message-----
> From: pgsql-general-owner@postgresql.org
> [mailto:pgsql-general-owner@postgresql.org]On Behalf Of Bob Pawley
> Sent: 23 janvier 2008 13:51
> To: PostgreSQL
> Subject: [GENERAL] Count
>
>
> I have a table with four columns that will either be null or hold the
value
> 'true'.
>
> I want to obtain the count of these columns, within a particular row, that
> have 'true' as a value (0 to 4).
>
> I have attempted the Select count method but it seems that I need
something
> more.
>
> If anyone has any thoughts it would be much appreciated.
>
> Bob
>
Or something like this ?
create table test (
id_test serial,
c1 boolean,
c2 boolean,
c3 boolean,
c4 boolean
);
insert into test (c1,c2,c3,c4) values ( true, null, null, true),( true,
true, null, true),( null, null, null, null);
select id_test, (case when c1 is null then 0 else 1 end)+(case when c2 is
null then 0 else 1 end)+(case when c3 is null then 0 else 1 end)+(case when
c4 is null then 0 else 1 end) as total from test;
id_test | total
---------+-------
1 | 2
2 | 3
3 | 0
Regards,
Charles Simard