UNIR dos resultados de la instrucción SELECT
¿Es posible unir los resultados de 2 sentencias sql SELECT en una sola sentencia? Tengo una base de datos de tareas donde cada registro es una tarea separada, con fechas límite (y un PALT, que es solo un INT de días desde el inicio hasta la fecha límite. La edad es también un número INT de días.)
Quiero tener una tabla que tenga a cada persona en la tabla, el número de tareas que tienen y el número de tareas TARDÍAS que tienen (si las hay.)
Puedo obtener estos datos en tablas separadas fácilmente, como entonces:
SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks
Devolviendo datos como:
ks # Tasks
person1 7
person2 3
Y luego tengo
SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks
Que devuelve:
ks # Late
person1 1
person2 1
Y quiero unir los resultados de estas dos sentencias select (por el KS)
Estoy tratando de evitar el uso de una tabla temporal, pero si esa es la única forma práctica de hacer esto, me gustaría saber más sobre el uso de tablas temporales de esta manera.
También intenté hacer algún tipo de count () # de filas que satisfagan un condicional, pero no pude averiguar cómo hacerlo bien. Si es posible, eso también funcionaría.
Adición: Lo siento, quiero que mis resultados tengan columnas para KS, Tareas y Tarde
KS # Tasks # Late
person1 7 1
person2 3 1
person3 2 0 (or null)
Además, quiero que una persona aparezca incluso si no tiene tareas tardías.
SUM (CASO CUANDO LA edad > Palt ENTONCES 1 ELSE 0 FIN) Tarde funciona bien, gracias por esta respuesta!
Dos sentencias select también funcionan, usar un JOIN IZQUIERDO para unirlas también funciona, y ahora entiendo cómo unir múltiples selects de esta manera. ¡Gracias!
5 answers
SELECT t1.ks, t1.[# Tasks], COALESCE(t2.[# Late], 0) AS [# Late]
FROM
(SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks) t1
LEFT JOIN
(SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks) t2
ON (t1.ks = t2.ks);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-05 21:53:17
Intenta algo como esto:
SELECT
*
FROM
(SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks) t1
INNER JOIN
(SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks) t2
ON t1.ks = t2.ks
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-10 16:40:35
Use UNION
:
SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks
UNION
SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks
O UNION ALL
si desea duplicados:
SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks
UNION ALL
SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-10 16:40:48
Puedes usar la palabra clave UNION ALL
para esto.
Aquí está el documento de MSDN para hacerlo en T-SQL http://msdn.microsoft.com/en-us/library/ms180026.aspx
UNION ALL-combina el conjunto de resultados
UNION-Hace algo así como una Unión de conjunto y no genera valores duplicados
La diferencia con un ejemplo: http://sql-plsql.blogspot.in/2010/05/difference-between-union-union-all.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-10 16:38:49
Si Age y Palt son columnas en la misma Tabla, puede contar (*) todas las tareas y sumar solo las tardías de esta manera:
select ks,
count(*) tasks,
sum(case when Age > Palt then 1 end) late
from Table
group by ks
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-10 16:50:49