繁体   English   中英

如何使用一条T-SQL语句获取计数和值?

[英]How to get count and value using one t-sql statement?

这是我想要得到的:

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

我知道此查询无效。 但是有什么办法可以使Column1的所有值以及Column1的计数和Column2的计数。

OVER子句修改聚合范围以允许查询根据需要发生

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

编辑:

以上适用于SQL Server 2005+

编辑2:

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

从多个连接尝试此操作,请注意在连接2中@@ ROWCOUNT决不等于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,请使用临时表来确保数据集的一致性。

尝试:

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

那应该可以为您提供所需的东西,然后在运行fetch命令时像平常一样使用它。

例如在php中, $rows = mysql_fetch_assoc(mysql_query($query)); echo $rows['CNT']; $rows = mysql_fetch_assoc(mysql_query($query)); echo $rows['CNT'];

所提出的问题没有道理。 您是说要对Col1和Col2的值的各个组合进行计数吗? 如果是这样的话:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM