2014-06-06 60 views
1

對於每個POSTAL_CODE,我想知道有多少NULL TIME_VISITEDs有多少NOT NULL TIME_VISITEDsSQL找到NULL和非NULL的條目數列

CREATE TABLE VISITS 
(
ID INTEGER NOT NULL, 
POSTAL_CODE VARCHAR(5) NOT NULL, 
TIME_VISITED TIMESTAMP, 
CONSTRAINT PK_VISITS PRIMARY KEY (ID) 
); 

的樣本數據:

INSERT INTO VISITS (ID, POSTAL_CODE, TIME_VISITED) VALUES ('234', '01910', '21.04.2014, 10:13:33.000'); 
INSERT INTO VISITS (ID, POSTAL_CODE, TIME_VISITED) VALUES ('334', '01910', '28.04.2014, 13:13:33.000'); 
INSERT INTO VISITS (ID, POSTAL_CODE, TIME_VISITED) VALUES ('433', '01910', '29.04.2014, 13:03:19.000'); 
INSERT INTO VISITS (ID, POSTAL_CODE, TIME_VISITED) VALUES ('533', '01910', NULL); 
INSERT INTO VISITS (ID, POSTAL_CODE, TIME_VISITED) VALUES ('833', '01910', NULL); 

這是上面的數據輸出I想:

POSTAL_CODE = 01910,NUM_TIME_VISITED_NULL = 2,NUM_TIME_VISITED_NOT_NULL = 3

我使用下面的SQL

SELECT distinct r.POSTAL_CODE, 
    (select count(*) from VISITS p where p.POSTAL_CODE=r.POSTAL_CODE and p.TIME_VISITED is null) as NUM_TIME_VISITED_NULL, 
    (select count(*) from VISITS p where p.POSTAL_CODE=r.POSTAL_CODE and p.TIME_VISITED is not null) as NUM_TIME_VISITED_NOT_NULL 
FROM VISITS r 
ORDER BY r.POSTAL_CODE 

查詢需要很長的時間,如果有很多行的表中的

做什麼樣的變化,我需要做出能夠得到這個信息更快?

+0

你可以檢查執行計劃嗎?你有訪問指數(postal_code,time_visited) – Thilo

回答

3

使用條件,而不是聚集:

select v.postal_code, 
     sum(case when v.time_visited is null then 1 else 0 
     end) as NumTimeVisitedNull, 
     count(v.time_visited) as NumTimeVisitedNotNull 
from visits v 
group by v.postal_code; 

注意:你也可以寫爲:

select v.postal_code, 
     (count(*) - count(v.time_visited)) as NumTimeVisitedNull, 
     count(v.time_visited) as NumTimeVisitedNotNull 
from visits v 
group by v.postal_code; 

count()功能明確計數的非NULL值的數目。

1

您可以一次完成所有操作。 COUNT計算有多少個非空值。然後使用CASE語句的SUM來計算所有NULL。

SELECT POSTAL_CODE 
     ,COUNT(TIME_VISITED) AS NUM_TIME_VISITED_NOT_NULL 
     ,SUM(CASE WHEN TIME_VISITED IS NULL THEN 1 ELSE 0 END)) AS NUM_TIME_VISITED_NULL 
FROM VISITS 
GROUP BY POSTAL_CODE