Как получить количество и значение, используя один оператор t-sql? - PullRequest
0 голосов
/ 25 января 2011

Вот что я пытаюсь получить: -

SELECT 
  Column1, 
  Count(Column1), 
  Count(Column2)
FROM Table1

Я знаю, что этот запрос недействителен.Но есть ли способ, которым я могу все значения Column1 и Count of Column1 и Count of Column2.

Ответы [ 3 ]

1 голос
/ 25 января 2011

Предложение OVER изменяет совокупный диапазон, чтобы запрос мог выполняться так, как вы хотите

SELECT 
  Column1, 
  Count(Column1) OVER (), 
  Count(Column2) OVER ()
FROM Table1

Редактировать:

выше для SQL Server 2005 +

Редактировать 2:

Решение CROSS JOIN / COUNT в SQL Server 2000 не является надежным под нагрузкой.

Попробуйте это из нескольких соединений, заметьте, что @@ ROWCOUNT никогда не будет равняться T2.cnt в соединении 2

--connection 1 
set nocount on;
drop table dbo.test_table;
GO
create table dbo.test_table
(
    id_field uniqueidentifier not null default(newid()),
    filler char(2000) not null default('a')
);
GO
create unique clustered index idx_id_fld on dbo.test_table(id_field);
GO
while 1 = 1
insert into dbo.test_table default values;

--connection 2 
select T2.cnt, T1.id_field, T1.filler
from dbo.test_table T1
cross join (select COUNT(*) as cnt from dbo.test_table) T2
SELECT @@ROWCOUNT

select T2.cnt, T1.id_field, T1.filler
from dbo.test_table T1
cross join (select COUNT(*) as cnt from dbo.test_table) T2
SELECT @@ROWCOUNT

select T2.cnt, T1.id_field, T1.filler
from dbo.test_table T1
cross join (select COUNT(*) as cnt from dbo.test_table) T2
SELECT @@ROWCOUNT

Edit3: cyberkiwi заявил, что тест не соответствует действительности. Мусор.

Если вы забудете @@ ROWCOUNT, вы увидите, что cnt отличается от количества строк в «сеточном режиме» SSMS

Теперь вы используете SET TRANSACTION ISOLATION LEVEL SERIALIZABLE, и он дает правильные результаты, но если вы достаточно заняты, чтобы получить противоречивые результаты, действительно ли вы хотите запустить это?

Используйте временную таблицу для обеспечения согласованного набора данных, если вы работаете с SQL Server 2000.

0 голосов
/ 25 января 2011

Вопрос, как его просили, не имеет смысла.Вы имеете в виду, что вы хотите рассчитывать отдельные комбинации значений Col1 и Col2?Если это так:

select column1,column2,count(*)
  from table1
 group by column1, column2

Если это не то, что вы хотите, пожалуйста, попробуйте дать примерные данные, как могут выглядеть входные данные и каков будет ваш желаемый выход.

0 голосов
/ 25 января 2011

Попробуйте:

SELECT column1,(SELECT COUNT(Column1),COUNT(Column2)) AS CNT FROM Table1

Это должно дать вам то, что вы хотите, тогда, когда вы запускаете команду извлечения, вы используете ее, как обычно.

Например, в php, $rows = mysql_fetch_assoc(mysql_query($query)); echo $rows['CNT'];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...