2012-08-01 54 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

相關問題