2016-07-21 3 views
-1

3 개 열에 대해 null이 아닌 값을 계산하려고합니다. 그러나 널이 아닌 값의 수가 다르더라도 3 개의 열 각각에 대해 동일한 COUNT가 리턴됩니다. 이것이 왜 그런지 확실하지 않습니다 (열 데이터 형식을 다시 작성해야합니까? 잘못된 SQL 절이 있습니까?). 아래는 제가 시도한 것과 결과입니다.여러 열에 대해 null이 아닌 값이 같은 COUNT 값이 같습니까?

편집 : 이미지를 텍스트로 바꿉니다. 더 짧은 별칭을 만들었습니다. 테이블의

uid  device_id install_ts   firstlogin_ts  firstpurchase_ts  
------ ---------- ------------------- ------------------- ------------------- 
121045 GalaxyS3 2015-01-01 14:00:01 2015-01-01 14:00:01 (null)    
121046 GalaxyS1 2015-01-01 14:00:03 2015-01-01 14:00:07 2015-01-02 06:00:07 
121047 iPhone3  2015-01-01 14:00:03 2015-01-01 14:00:03 (null)    
121048 GalaxyS1 2015-01-01 14:00:04 (null)    (null)    
121049 iPhone5  2015-01-01 14:00:07 2015-01-01 14:00:08 (null)    
121050 iPad4  2015-01-01 14:00:07 2015-01-01 14:00:09 (null)    
121051 iPhone4s 2015-01-01 14:00:11 (null)    (null)    
121052 iPhone4s 2015-01-01 14:00:13 (null)    (null)    
121053 GalaxyTab3 2015-01-01 14:00:16 (null)    (null)    
121054 iPhone4  2015-01-01 14:00:19 2015-01-01 14:00:22 (null)    
121055 iPad1  2015-01-01 14:00:22 2015-01-01 14:00:26 (null)    
121056 iPad2  2015-01-01 14:00:26 2015-01-01 14:00:29 (null)    
121057 GalaxyTab2 2015-01-01 14:00:30 2015-01-01 14:00:31 (null)    
121058 iPhone5s 2015-01-01 14:00:34 2015-01-01 14:00:38 (null)    
121059 GalaxyS5 2015-01-01 14:00:34 (null)    (null)    
121060 GalaxyS5 2015-01-01 14:00:34 2015-01-01 14:00:38 (null)    
121061 GalaxyS5 2015-01-01 14:00:37 (null)    (null)    
121062 iPhone3  2015-01-01 14:00:39 (null)    (null)    

설명 :

DESCRIBE users 
Field    Type   Null Key Default    Extra       
---------------- ----------- ---- --- ------------------- --------------------------- 
uid    int(11)  YES MUL (null)            
device_id   varchar(64) YES  (null)            
install_ts  timestamp NO   CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP 
firstlogin_ts  timestamp NO   0000-00-00 00:00:00        
firstpurchase_ts timestamp NO   0000-00-00 00:00:00        

편집 : 여기

SELECT CAST(users.install_ts AS Date) AS inst_date, 
     COUNT(users.install_ts) AS total_inst, 
     COUNT(users.firstlogin_ts) AS total_first_logins, 
     COUNT(users.firstpurchase_ts) AS conv_cust, 
     SUM(CASE WHEN users.firstpurchase_ts IS NULL THEN 1 ELSE 0 END) AS conv_cust 
FROM users 
GROUP BY CAST(users.install_ts AS Date) 

inst_date total_inst total_first_logins conv_cust conv_cust 
---------- ---------- ------------------ --------- --------- 
2015-01-01 17191  17191    17191  0   
2015-01-02 41038  41038    41038  0   
2015-01-03 41176  41176    41176  0   
2015-01-04 41072  41072    41072  0   
2015-01-05 41115  41115    41115  0   
2015-01-06 8417  8417    8417  0   
2015-05-16 9991  9991    9991  0  

users 테이블 한 번에 하나씩 수행은 동일한 결과를 제공합니다. 어쩌면 그룹화 문제 일 수 있습니다. 그렇다면 의도 한 결과를 얻으려면 어떻게해야합니까? 한 번에

하나 :

SELECT COUNT(users.firstlogin_ts) AS total_first_logins 
FROM users 
GROUP BY CAST(users.install_ts AS Date) 

total_first_logins 
17191 
41038 
41176 
41072 
41115 
8417 
9991 

또 다른 칼럼 :

SELECT COUNT(users.install_ts) AS total_inst 
FROM users 
GROUP BY CAST(users.install_ts AS Date) 

total_inst 
17191 
41038 
41176 
41072 
41115 
8417 
9991 
+0

나는 네가 한 일을 내가했다고 생각한다. 감사. – user2205916

+0

그룹화 문제로 인해 문제가 발생할 수 있습니다. 적어도 캐스트의 값 범위 내에서 (사실상 무작위로) install_ts 대신 캐스트를 선택해야합니다. _ 여전히 카운트 값 문제를 일으킬 것이라고 생각하지 않습니다 ._ – Uueerdo

+0

정확한 쿼리입니까, 아니면 어떤 방식 으로든 '로그인'및/또는 '수익'에 '가입'합니까? – Uueerdo

답변

1

으로 이런 일을 시도 할 수 문제의 근원에있는 디스플레이 문제. 현재 표시된 데이터는 (null)이지만 테이블 설명은 필드가 먼저 nullable이 아님을 나타냅니다. 그러나 필드의 기본값은 '0000-00-00 00:00:00'입니다.이 값은 유형에 유효한 값이 아니지만 허용됩니다 (이상 함). 일부 API는 데이터베이스에서 실제로 NULL이 아니더라도 이러한 값을 null로 변환합니다. 대신이 시도 :

SELECT CAST(users.install_ts AS Date) AS inst_date, 
     COUNT(1) AS total_inst, 
     COUNT(NULLIF(users.firstlogin_ts, '0000-00-00 00:00:00')) AS total_first_logins, 
     COUNT(NULLIF(users.firstpurchase_ts, '0000-00-00 00:00:00')) AS conv_cust 
FROM users 
GROUP BY CAST(users.install_ts AS Date) 

NULLIF

사실 NULL 값과 같은 값을 변환합니다.

+0

이것은 문제를 해결했습니다! 도움이되는 설명에 감사드립니다. – user2205916

0

당신이 내가 될 수 있습니다 추측하고 여기에 지정된 https://dba.stackexchange.com/questions/64927/count-null-and-not-null-values-in-a-column

SELECT CAST(users.install_ts AS Date) AS inst_date, 
     COUNT(!ISNULL(users.install_ts)) AS total_inst, 
     COUNT(!ISNULL(users.firstlogin_ts)) AS total_first_logins, 
     COUNT(!ISNULL(users.firstpurchase_ts)) AS conv_cust, 
     SUM(!ISNULL(users.firstpurchase_ts)) AS conv_cust 
FROM users 
GROUP BY CAST(users.install_ts AS Date) 
+0

나는 그 쿼리를 실행했고 나는 같은 결과를 얻었다. 어쩌면 열이 "타임 스탬프"로 코딩된다는 사실과 관련이 있을지 모릅니다. – user2205916

관련 문제