2013-12-19 104 views
0

我正在尋找一種方式來有效地計算每個ID子值:如何計算每個另一列值一行的不同出現的次數

ID  |  subvalue 
001 |  056 
001 |  093 
001 | 
002 |  054 
002 |  033 
003 |  
003 |  012 
003 |  094 
003 |  008 
004 |  

導致:

ID  |  Count 
001 |  2 
002 |  2 
003 |  3 
004 |  0 

而獨特的價值相當於:

輕微加:

ID  |  subvalue 
    001 |  001 
    001 |  001 
    001 |  
    002 |  002 
    002 |  002 
    003 |  
    003 |  003 
    003 |  003 
    003 |  003 
    004 | 

導致:

ID  |  Count 
001 |  2 
002 |  2 
003 |  3 
004 |  0 
+0

那你試試?什麼是缺失值,空字符串或NULL? –

回答

2

這是基本的SQL,你按你想和使用聚合函數count()

select id, count(subvalue) as count 
from table 
group by id 

,如果你指定一個字段計數不計空值的項目名稱。

如果您有(不是這個情況)空字符串(或其他標準),你不想來算,你可以把它在where子句中,或使用的情況下,像這樣:

select id, sum(CASE stringValue = '' THEN 0 ELSE 1 END) as count 
from table 
group by id 
+1

不會爲'004'返回1嗎? OP想要排除*空*值 –

+0

@PanagiotisKanavos - 是的,我有一個錯字,使用的是ID而不是子值 – Hogan

+0

@Hogan我相當確信它仍然會返回1'004' –

0
DECLARE @T TABLE (ID VARCHAR(10), SubValue VARCHAR(10)) 

INSERT INTO @T 
VALUES ('001','056'),('001','093'),('001',NULL),('002','054'), 
('002','033'),('003',NULL),('003','012'),('003','094'), 
('003','008'),('004',NULL) 

SELECT A.ID, ISNULL(COUNT(A.ID), 0) Total 
FROM @T A LEFT JOIN @T B 
ON A.ID = B.ID AND A.SubValue = B.SubValue 
WHERE B.SubValue IS NOT NULL 
GROUP BY A.ID 

結果

╔═════════╦═══════╗ 
║  ID ║ Total ║ 
╠═════════╬═══════╣ 
║  001 ║  2 ║ 
║  002 ║  2 ║ 
║  003 ║  3 ║ 
╚═════════╩═══════╝ 

或者,如果你想回到4號,以及你可以做這樣的事情

SELECT DISTINCT A.ID, COALESCE(Total, 0) Total 
FROM @T A LEFT JOIN (SELECT ID, COUNT(ID) AS Total 
        FROM @T 
        WHERE SubValue IS NOT NULL 
        GROUP BY ID) C 
ON A.ID = C.ID 

結果

╔═════════╦═══════╗ 
║  ID ║ Total ║ 
╠═════════╬═══════╣ 
║  001 ║  2 ║ 
║  002 ║  2 ║ 
║  003 ║  3 ║ 
║  004 ║  0 ║ 
╚═════════╩═══════╝ 

SELECT ID, SUM(CASE WHEN SubValue IS NULL THEN 0 ELSE 1 END) as [COUNT] 
FROM @T 
GROUP BY ID 
+0

這將從結果中刪除004' –

+0

@PanagiotisKanavos將所有內容複製粘貼到SSMS中,並檢查自己:) –

+0

現在運行最新版本,只需要一些時間 – rorytmeadows

0

你只是希望組和空白排除在外?

沒有運行它,但我覺得這樣的事情應該讓你有:

Select ids. ID, Coelesce(counts.value, 0) 

(Select Distinct ID 
From TableName) as ids 

left join 

    (Select ID, Count(subvalue) as value 
    From TableName 
    Where value is not null 
    And value != '' 
    Group By ID) as counts 

on ids.id = counts.id 
相關問題