2011-10-05 19 views
5

Aquí está la consulta:Compute por ciento en SQLite

select 
(
SELECT  COUNT(*) 
FROM   Sending s 
WHERE  (ConfID = 1) AND (Status = 1) 
) 
/
(
(
SELECT  COUNT(*) 
FROM   Numbers 
WHERE  (ConfID = 1) 
) 
/
100 
) 

Quiero calcular por ciento. Por ejemplo, si la consulta

SELECT  COUNT(*) 
    FROM   Numbers 
    WHERE  (ConfID = 1) 

da 100 y el otro

SELECT  COUNT(*) 
    FROM   Sending s 
    WHERE  (ConfID = 1) AND (Status = 1) 

resultados 50 la consulta resultado debe volver 50, lo que significa 50%. Pero son los primeros resultados de consulta con 2 y el segundo devuelve 10000, la consulta resultante arroja 0. Creo que debería definir de alguna manera para devolver el número de flotante, etc.

Gracias!

+1

¿Usted intentó (100 * FIRST_QUERY)/SECOND_QUERY? –

+0

@Laurent '¿No es '(100 * FIRST_QUERY)/SECOND_QUERY' lo mismo que' (FIRST_QUERY)/(SECOND_QUERY/100) '? –

+1

@Benoit Lo sé, mira mi respuesta. La sugerencia de Laurent tampoco funcionó (mire la respuesta de EmptyStack y el comentario de OP). Mi punto es: incluso si la sugerencia de Laurent hubiera funcionado, sería engañoso. No rehagas tus cálculos para intentar engañar a los tipos de datos. Trabaja con los tipos de datos correctos en su lugar. –

Respuesta

7

Intente dividir por 100.0 en lugar de 100. Eso obligará a un elenco punto flotante tipo de datos:

select 
(
SELECT  COUNT(*) 
FROM   Sending s 
WHERE  (ConfID = 1) AND (Status = 1) 
) 
/
(
(
SELECT  COUNT(*) 
FROM   Numbers 
WHERE  (ConfID = 1) 
) 
/
100.0 
) 
+0

Diamante! ¡Explícitamente que lo necesito! ¡Muchas gracias! – kseen

0

Probar:

SELECT SUM(CASE status WHEN 1 THEN 100 ELSE 0 END)/COUNT(*) 
    FROM numbers 
WHERE confid = 1 
+1

Esta fue también mi idea inicial, el problema es que OP está seleccionando de 2 tablas diferentes –

+0

Ya está sumando 100s. Sin embargo, su división de resultados será '200/10000 = 0.02' que en la división entera redondeará a' 0'. Necesitas resumir '100.0' –

+0

@Adrian: excepto si quiero un valor que se redondee a un entero (generalmente esto es suficiente retroalimentación para un usuario). De lo contrario, tienes razón! – Benoit

Cuestiones relacionadas