Два счета на основе значения поля

У меня есть стол table1 это имеет field1 имеет значения от 1 до 5 мне нужно, чтобы получить количество записей, когда field1 = 1 и количество оставшихся записей, когда field1 <> 1, так что я мог бы сделать это так:

select count(*) from table1
group by field1 = 1

однако это даст мне два правильных значения в виде двух записей в результате, но мне интересно, есть ли способ получить два значения счетчика в виде столбцов в одном выбранном SQL?

3 ответа

Решение

Вы не нуждаетесь в подвыборах на самом деле. Достаточно использовать один запрос.

Подсказка: стандартные агрегатные функции SQL игнорируют все значения NULL.

c:\Program Files\Firebird\Firebird_3_0>isql
Use CONNECT or CREATE DATABASE to specify a database
SQL> create database "b:\testfb3.fdb" ;

SQL> create table oneTwoFive (field1 int);

SQL> set bulk_insert insert into onetwofive(field1) values (?);
BULK> (1)
BULK> (2)
BULK> (3)
BULK> (4)
BULK> (5)
BULK> (1)
BULK> (1)
BULK> (2)
BULK>

SQL> select * from onetwofive;

      FIELD1
============
           1
           2
           3
           4
           5
           1
           1
           2

SQL> select distinct count(*), field1=1 as "Is One Flag" from onetwofive
CON> group by 2;

                COUNT Is One Flag
===================== ===========
                    3 <true>
                    5 <false>

SQL> select
CON> count(case when field1=1 then 1 else null end) "When One",
CON> count(case when field1=1 then null else 1 end) "Rest"
CON> from oneTwoFive;

             When One                  Rest
===================== =====================
                    3                     5
create table onetwofive (field1 int)
go
insert into onetwofive (field1) values
    (1),(2),(3),(4),(5),(1),(1),(2)
go
select (select count(*) from onetwofive where field1 = 1) ones,
       (select count(*) from onetwofive where field1 <> 1) others
       from rdb$database

Если вы не хотите создавать промежуточную таблицу, у вас также есть решение подзапроса. Этот должен делать то, что вы ищете:

select distinct * from
(select count(*) as ones from table1 group by field1 having field1 = 1) as ones 
join 
(select count(*) as not_ones from table1 group by field1 having field1 <> 1) as not_ones;

Вы должны получить что-то вроде ниже:

+------+----------+
| ones | not_ones |
+------+----------+
|  9   |      6   |
+------+----------+
1 row in set (0,00 sec)

Надеюсь это поможет.

Другие вопросы по тегам