2010-10-15 60 views
2

假設如下表:如何計算有多少這些列在SQL中有值?

ID | Item1 | Item2 | Item3 | Item4 | Item5 
------------------------------------------ 
A | NULL | NULL | YES | YES | NULL 
B | NULL | NULL | NULL | YES | NULL 
C | NULL | NULL | NULL | NULL | NULL 

我想返回以下數據集:

ID | Count 
------------ 
A | 2 
B | 1 
C | 0 

基本上,我想計數多少Item1-5的列都沒有NULL爲ID

如何在MS-SQL中執行此操作?

回答

4

未經測試,但類似這樣的應該工作。

SELECT 
    Id, 
    SUM(
    CASE WHEN Item1 is NULL THEN 0 ELSE 1 END 
    + 
    CASE WHEN Item2 is NULL THEN 0 ELSE 1 END 
    + 
    CASE WHEN Item3 is NULL THEN 0 ELSE 1 END 
    + 
    CASE WHEN Item4 is NULL THEN 0 ELSE 1 END 
    + 
    CASE WHEN Item5 is NULL THEN 0 ELSE 1 END 
    ) 'Count' 
FROM 
    tableName 
GROUP BY 
    Id 
+0

我可能是錯的,但我會打賭這個ID是一個主鍵,這意味着'SUM()'和'GROUP BY'不需要,只會增加開銷到查詢 – 2010-10-15 20:46:30

+0

我認爲同樣的事情,但不想承擔。 – 2010-10-15 22:00:41

0

這應做到:

SELECT ID, (case when item1 is null then 0 else 1 end)+ 
      (case when item2 is null then 0 else 1 end)+ 
      (case when item3 is null then 0 else 1 end)+ 
      (case when item4 is null then 0 else 1 end)+ 
      (case when item5 is null then 0 else 1 end) AS Count 
FROM Table 
ORDER BY ID 

我希望這是一個假設性的問題,而不是實際的生產表。

+0

它實際上是一個非常奇怪的一次性銷售查詢想知道,如果一個產品有一定的屬性沒有設置爲null – 2010-10-15 20:42:25

+0

感謝喬添加兩端:)。 – 2010-10-15 20:44:08

+0

你會得到這個代碼的錯誤,因爲每個CASE都需要「END」。此外,「當NULL」將不起作用,每行將返回5的計數。 – 2010-10-15 20:45:21

2

嘗試:

DECLARE @YourTable table (ID char(1), Item1 varchar(3), Item2 varchar(3), Item3 varchar(3), Item4 varchar(3), Item5 varchar(3)) 
INSERT @YourTable VALUES ('A' , NULL , NULL , 'YES' , 'YES' , NULL) 
INSERT @YourTable VALUES ('B' , NULL , NULL , NULL , 'YES' , NULL) 
INSERT @YourTable VALUES ('C' , NULL , NULL , NULL , NULL , NULL) 

SELECT 
    ID, CASE WHEN ITEM1 IS NULL THEN 0 ELSE 1 END 
     +CASE WHEN ITEM2 IS NULL THEN 0 ELSE 1 END 
     +CASE WHEN ITEM3 IS NULL THEN 0 ELSE 1 END 
     +CASE WHEN ITEM4 IS NULL THEN 0 ELSE 1 END 
     +CASE WHEN ITEM5 IS NULL THEN 0 ELSE 1 END AS [Count] 
    FROM @YourTable 

OUTPUT:

ID Count 
---- ----------- 
A 2 
B 1 
C 0 

(3 row(s) affected) 
0

只是另一種選擇:如果你在SQL 2K5或更高版本,你也可以使用逆透視來計算所有非空值。你不會直接從這個查詢中獲得任何零計數的行。但它確實節省了案件陳述的乏味。

select 
    ID, count(ItemCount) as ItemCount 
from 
(
    select ID, Item1, Item2, Item3, Item4, Item5 
    from TableA a 
) t 
unpivot 
(
    ItemCount for Item in 
    (
     Item1, Item2, Item3, Item4, Item5 
    ) 
) as unpvt 
group by 
    ID 
0

另一種技術。

SELECT 
    ID, 
    (SELECT COUNT(C) FROM( 
      SELECT Item1 C 
      UNION ALL 
      SELECT Item2 
      UNION ALL 
      SELECT Item3 
      UNION ALL 
      SELECT Item4 
      UNION ALL 
      SELECT Item5) 
      D) 
AS [Count] 
FROM @YourTable 
相關問題