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!

Author: ekad, 2012-05-10

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);
 190
Author: Phil,
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
 43
Author: Mithrandir,
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
 29
Author: aF.,
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

 13
Author: Baz1nga,
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
 13
Author: Nikola Markovinović,
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