如何使用一个t-sql语句获取计数和值?

时间:2011-01-25 18:58:49

标签: sql sql-server tsql

以下是我想要的: -

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

我知道此查询无效。但是,我有什么方法可以将第1列和第1列的计数以及第2列的计数的所有值都包含在内。

3 个答案:

答案 0 :(得分:1)

OVER子句修改聚合范围以允许查询按您的需要进行

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

编辑:

上面的SQL Server 2005 +

编辑2:

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

从多个连接中尝试这一点,注意@@ ROWCOUNT永远不等于连接2中的T2.cnt

--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,请使用临时表来确保数据集一致。

答案 1 :(得分:0)

尝试:

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

那应该可以得到你想要的东西,然后当你运行你的fetch命令时,就像平常一样使用它。

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

答案 2 :(得分:0)

正如所提出的那样,这个问题没有意义。你的意思是你想要Col1和Col2的各个值组合的计数?如果是这样的话:

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

如果这不是你想要的,请尝试提供一些示例数据,输入可能是什么样的,以及你想要的输出是什么。