2011-01-25 34 views

回答

1

OVER子句修改汇总范围,允许查询发生,只要你想

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

编辑:

上面的SQL Server 2005+

编辑2:

SQL Server 2000中的CROSS JOIN/COUNT解决方案在加载时不可靠。

从多个连接试试这个,注意@@ ROWCOUNT从来没有在连接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等于T2.cnt:cyberkiwi规定的测试是错误的。垃圾。

如果你忘记了@@ ROWCOUNT,你可以看到cnt是在SSMS“网格模式”行数

现在不同了,你用SET TRANSACTION ISOLATION LEVEL SERIALIZABLE,它并给出正确的结果,但如果你是够忙得到不一致的结果你真的想运行这个吗?

使用临时表,以确保一致的数据集,如果你正在运行SQL Server 2000

+0

这是版本相关的,对吧? – 2011-01-25 19:01:54

+0

@nathan gonzalez:是的,SQL Server 2005 + – gbn 2011-01-25 19:03:53

0

尝试:

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

这应该得到你想要的东西,那么当你运行你的取得命令你像你一样使用它。

E.g.在php中, $rows = mysql_fetch_assoc(mysql_query($query)); echo $rows['CNT'];

0

问题,如问,没有意义。你的意思是你想要Col1和Col2的值的个别组合的计数?如果是这样的:

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

如果这不是你想要的请尝试给出一些示例数据,输入可能是什么样子,你的期望的输出会是什么。