2016-07-21 10 views
-1

Ich versuche, Nicht-Null-Werte für drei Spalten zu zählen. Für jede der drei Spalten wird jedoch derselbe COUNT-Wert zurückgegeben, obwohl die Anzahl der Nicht-Null-Werte unterschiedlich ist. Ich bin mir nicht sicher, warum das der Fall ist (muss ich den Spaltendatentyp falsch-SQL-Klausel neu formulieren?). Unten ist was ich versucht habe und die Ergebnisse.COUNT Nicht-Null-Werte für mehrere Spalten sind gleich?

EDIT: Bilder mit Text ersetzt. kürzere Aliase erstellt.

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  

Hier ist der Tisch users ist:

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)    

Beschreibung der Tabelle:

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: Handeln sie einer nach dem anderen gibt die gleichen Ergebnisse. Vielleicht ist es ein Gruppierungsproblem. Wenn dies der Fall ist, wie gehe ich vor, um meine beabsichtigten Ergebnisse zu erzielen?

One zu einem Zeitpunkt:

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 

Eine weitere Säule:

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

sicher. Ich denke, ich habe getan, was Sie gefragt haben. Vielen Dank. – user2205916

+0

Sie Gruppierung scheint, als könnte es einige Probleme verursachen; Zumindest sollten Sie die Besetzung statt einer (praktisch zufälligen) Installation_ts im Wertebereich des Cast auswählen. _Ich würde immer noch nicht denken, dass es Ihr Zählwert Problem verursachen würde. _ – Uueerdo

+0

Ist das die genaue Abfrage, die Sie verwendet haben, oder sind Sie 'Join' 'Logins' und/oder 'Umsatz' in irgendeiner Weise? – Uueerdo

Antwort

1

ich dort bin zu raten sein könnte ein Anzeigeproblem an der Wurzel Ihres Problems. Die Daten, die Sie anzeigen, zeigen (null), aber die Tabellenbeschreibung gibt an, dass die Felder an erster Stelle nicht nullbar sind. Die Felder sind jedoch standardmäßig auf '0000-00-00 00:00:00' eingestellt, was für den Typ kein gültiger Wert ist, aber erlaubt ist (es ist seltsam). Einige APIs konvertieren solche Werte in null, obwohl sie in der Datenbank nicht wirklich NULL sind. Versuchen Sie stattdessen:

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 werden solche Werte zu wahren NULL Werte konvertieren.

+0

Das hat das Problem gelöst! Danke für die hilfreiche Erklärung. – user2205916

0

Können Sie versuchen, so etwas wie dies, wie hier angegeben 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

Ich habe diese Abfrage ausgeführt und ich bekomme die gleichen Ergebnisse. Vielleicht hat das etwas damit zu tun, dass die Spalten als "Timestamp" codiert sind? – user2205916