2016-07-21 3 views
-1

Я пытаюсь подсчитать ненулевые значения для трех столбцов. Однако тот же COUNT возвращается для каждого из трех столбцов, несмотря на то, что имеет различное количество ненулевых значений. Я не уверен, почему это так (мне нужно переделать тип данных столбца? Неправильный SQL-предложение?). Ниже я попытался и результаты.COUNT ненулевые значения для нескольких столбцов одинаковы?

EDIT: заменены изображения текстом. сделал более короткие псевдонимы.

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 стол:

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        

EDIT: Выполнение их по одному за раз дает те же результаты. Возможно, это проблема группировки. Если это так, как я могу достичь своих ожидаемых результатов?

Поочередно:

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 в пределах диапазона значений cast. _I все еще не думал, что это вызовет проблему с вашими значениями количества баллов ._ – Uueerdo

+0

Это точный запрос, который вы использовали, или вы «присоединяетесь» к «входам» и/или «доходам» каким-либо образом? – Uueerdo

ответ

1

Я предполагаю, что может быть проблема с отображением в корне вашей проблемы. Представленные вами данные показывают (null), но в описании таблицы указано, что поля не имеют значения NULL. Однако поля по умолчанию равны «0000-00-00 00:00:00», что не совсем допустимое значение для типа, но разрешено (это странно). Некоторые API-интерфейсы преобразуют такие значения в нуль, даже если они не имеют 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

Смежные вопросы