Quiero evitar hacer una sub-selección en una tabla para comparar dos períodos y si la tendencia es a la baja.
Esta selección obtiene el porcentaje en un período
SELECT user, (SUM(value1)/SUM(value2)) AS percentage1
FROM table
WHERE (date BETWEEN @start1 AND @end1)
GROUP BY user
ORDER BY 2
Esta consulta obtiene el resultado que busco, pero no es muy eficiente porque hay más de 100 millones de filas.
SELECT t1.user, (SUM(t1.value1)/SUM(t1.value2)) AS percentage1,
(SELECT (SUM(t2.value1)/SUM(t2.value2)) AS percentage2
FROM table AS t2
WHERE t2.userID = t1.userID
AND (t2.date BETWEEN @start2 AND @end2)
)
FROM table AS t1
WHERE (t1.date BETWEEN @start1 AND @end1)
AND (SUM(t1.value1)/SUM(t1.value2)) < (SELECT (SUM(t2.value1)/SUM(t2.value2))
FROM table AS t2
WHERE t2.userID = t1.userID
AND (t2.date BETWEEN @start2 AND @end2)
)
GROUP BY t1.user
¿Existe una forma mejor de hacer esto? Una solución podría ser simplemente tener un período de fecha y luego agrupar en el mes (fecha), año (fecha) y comparar con el mes anterior en lugar de tener dos fechas exactas. Pero agrupar por mes y año solo da varias filas para cada usuario y eso quiero evitar.
Solo quiero un resultado limpio como este:
Adam, 43%, 47%
Lisa, 22%, 25%
John, 18%, 34%
Excluyendo filas como esta porque la tendencia es un porcentaje menor
Bill, 24%, 18%
Nina, 84%, 56%
SQL-Server 2016 Enterprise es la base de datos.
Puedes probar esto.
SELECT G1.user, G1.percentage1, G2.percentage2
FROM
( SELECT t1.user, t1.userID
(SUM(t1.value1)/SUM(t1.value2)) AS percentage1,
FROM table AS t1
WHERE
(t1.date BETWEEN @start1 AND @end1)
GROUP BY t1.user, t1.userID
) AS G1
INNER JOIN (
SELECT t2.userID, (SUM(t2.value1)/SUM(t2.value2)) AS percentage2
FROM table AS t2
WHERE
(t2.date BETWEEN @start2 AND @end2)
GROUP BY t2.userID
) AS G2 ON G1.userID = G2.userID
WHERE
G1.percentage1 < G2.percentage2
Pero si desea usar solo una selección de la tabla, también puede probar esto.
DECLARE @start DATE
DECLARE @end DATE
SET @start = CASE WHEN @start1 < @start2 THEN @start1 ELSE @start2 END
SET @end = CASE WHEN @end1 > @end2 THEN @end1 ELSE @end2 END
SELECT * FROM (
SELECT t.userID,
SUM( CASE WHEN t.date BETWEEN @start1 AND @end1 THEN t.value1 END ) / SUM( CASE WHEN t.date BETWEEN @start1 AND @end1 THEN t.value2 END ) AS percentage1,
SUM( CASE WHEN t.date BETWEEN @start2 AND @end2 THEN t.value1 END ) / SUM( CASE WHEN t.date BETWEEN @start2 AND @end2 THEN t.value2 END ) AS percentage2,
FROM table AS t
WHERE
(t.date BETWEEN @start AND @end)
GROUP BY t.userID
) AS SQ WHERE percentage1 < percentage2
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras