2012-12-10 51 views
4

我的表看起來像這樣:多計數和羣體通過

ID ProductName ProductCode 
1 abc   123 
2 abc   123 
3 abc   456 
4 def   789 
5 ghi   246 
6 jkl   369 
7 jkl   369 
8 jkl   369 
9 jkl   468 
10 jkl   468 

我希望創建一個看起來像這樣的彙總表:

ProductName ProductCode Total 
abc   123   2 
abc   456   1 
jkl   369   3 
jkl   468   2 

換句話說,我沒興趣產品「def」和「ghi」,因爲它們只在原始表格中出現一次。對於其他所有我想按ProductName和ProductCode進行分組並顯示計數。

我試過玩group with by子句和where(select ...)但我剛剛結束了圍繞圈子。

該表大約有50,000行,位於SQL Server 2008 R2上。

回答

3

這是它:

SELECT 
     ProductName, 
     ProductCode, 
     COUNT(*) as Total 
FROM Table1 
WHERE ProductName IN (SELECT ProductName FROM Table1 GROUP BY ProductName HAVING COUNT(*) > 1) 
GROUP BY ProductName, ProductCode 

http://www.sqlfiddle.com/#!3/c79ad/9

+0

謝謝,這個作品完美。 – immyh

0

要過濾,你需要使用HAVING條款合計:

SELECT 
    ProductName, 
    ProductCode, 
    COUNT(*) as Total 
FROM T 
GROUP BY ProductName, ProductCode 
HAVING COUNT(*) > 1 
+0

+1,是的,你是對的。我錯過了。 –

+0

應該> 1? –

+0

如果您想使用它,請點擊[** a demo **](http://www.sqlfiddle.com/#!3/c79ad/7)。 –

-1

你不能對你聚集在列中使用WHERE。您需要改用HAVING

SELECT ProductName, 
     ProductCode, 
     COUNT(*) AS Total 
FROM  Products p 
GROUP BY p.ProductName, 
     p.ProductCode 
HAVING COUNT(p.ProductName) > 1 
+0

好吧,你是對的 - 錯過了這樣一個事實,即如果它是ProductName的重複,那麼這兩個列的單個出現仍應包含在內。 – PeteGO

0
;WITH cte AS 
(
    SELECT ID, ProductName, ProductCode, 
     COUNT(*) OVER (PARTITION BY ProductName, ProductCode) AS Total, 
     COUNT(*) OVER (PARTITION BY ProductName) AS PCount, 
     ROW_NUMBER() OVER (PARTITION BY ProductName, ProductCode ORDER BY ID) AS rn 
    FROM Products 
) 
    SELECT ID, ProductName, ProductCode, Total 
    FROM cte 
    WHERE PCount > 1 AND rn = 1