2012-08-01 59 views
1

比方说有一个结果集...我需要把它打印出来,像这样:提前如何统计每组的数字?

ID Count 
1 5 
1 5 
1 5 
1 5 
1 5 
2 2 
2 2 
3 1 

感谢。

+1

请标记您的SQL Server版本。 – 2012-08-01 22:10:00

回答

8

你的意思是你的查询:

SELECT ID, COUNT(*) AS "Count" 
FROM tableX 
GROUP BY ID ; 

产生这样的:

ID Count 
1 5 
2 2 
3 1 

但你希望?:

ID Count 
1 5 
1 5 
1 5 
1 5 
1 5 
2 2 
2 2 
3 1 

然后,这个查询将做到:

SELECT grp.ID, grp."Count" 
FROM 
     tableX AS t 
    JOIN 
     (SELECT ID, COUNT(*) AS "Count" 
      FROM tableX 
      GROUP BY ID 
     ) AS grp 
     ON grp.ID = t.ID ; 

它可以在几乎所有的DBMS和所有版本的SQL-Server中工作。对于SQL Server 2005和更高版本(以及Oracle和Postgres),OVER子句的答案看起来更加优雅,可能是首选。在你的版本中测试哪一个更高效。我认为在2012版本中,OVER子句的查询效率很高。

+0

你说“用OVER子句答案更好。”但根据我的经验,这些窗口功能可能会造成巨大的性能下降。有些时候,当我使用'Count()OVER'时,查询变得非常缓慢,并且当我刚刚将行人连接到聚合子查询时又变得很快,就像这里一样。 – ErikE 2012-08-02 00:01:52

+0

@ErikE:你很可能是对的。我会编辑。 – 2012-08-02 00:03:23

8

您可以使用count()OVER clause

select a, count(*) over (partition by a) as [count] 
from tableName ; 

这就是所谓的窗函数。我建议你研究这些。

+1

糟糕,我没有注意到[tag:SQL-Server]标签。这比我的回答更好,更简单。 – 2012-08-01 21:11:35

+0

谢谢,我开始在这个网站回答。这非常有趣。它也提高了我的英语 – 2012-08-01 21:13:20

+3

@ypercube - 但它没有说'SQL Server 2005 +'。你的回答是正确的,不知道你是否应该删除它 – Lamak 2012-08-01 21:37:39

相关问题