2016-12-06 2 views
0

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

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

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

+0

Как правильно ответить Ариоха? Он имеет один столбец со счетом 1, на ваш вопрос задан счет 1 и количество не-1 в двух столбцах. Я не уверен, как ответ, который возникает в одной строке, и не учитывает не-те, затрагивает ваш вопрос. – billpennock

+0

его ответ состоит из двух столбцов, с использованием 'case' в одном SQL – Wel

+0

Oh geesshh ... по какой-то причине полоса прокрутки не отображалась, когда я смотрел на нее в первый раз, и мой интерфейс только доходил до первого строка первого запроса, которая была данными 3 и «истина». Я должен был признать, что, должно быть, был более вдохновлен отсутствием свитка, учитывая, что он должен был иметь второй ряд. Итак, яйцо на лице, вам понравился его ответ лучше. круто. – billpennock

ответ

1

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

Подсказка: агрегатные функции SQL-стандарта игнорируют значения all-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 
2
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 
+0

нет необходимости в подвыборах :-P –

1

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

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) 

Надеется, что это помогает.

+0

нет необходимости в подвыборах :-P –

+0

Действительно? Вы имеете в виду, что я могу просто украсить счет из общего количества записей? Но как это сделать в одном запросе? –

+0

просто посмотри на эту страницу в своем ответе. Вы должны одновременно запускать два счетчика. –