sql - inner - ÚNASE a dos resultados de declaración SELECT
sql group by having (5)
¿Es posible unir los resultados de 2 sentencias SQL SELECT en una declaración? 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 mesa, 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, así:
SELECT ks, COUNT(*) AS ''# Tasks'' FROM Table GROUP BY ks
devolver 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 unirme a los resultados de estas dos declaraciones seleccionadas (por el KS)
Estoy tratando de evitar el uso de una tabla temporal, pero si esa es la única forma práctica de hacerlo, me gustaría saber más sobre el uso de tablas temporales de esta manera.
También traté de hacer algún tipo de conteo () # de filas que satisfagan un condicional, pero tampoco pude encontrar la manera de hacerlo. Si es posible, eso también funcionaría.
Adición: Lo siento, quiero que mis resultados tengan columnas para KS, Tareas y Último
KS # Tasks # Late
person1 7 1
person2 3 1
person3 2 0 (or null)
Además, quiero que aparezca una persona incluso si no tiene tareas atrasadas.
SUM (CASO CUANDO Edad> Palt THEN 1 ELSE 0 END) ¡Tarde funciona bien, gracias por esta respuesta!
Dos sentencias select también funcionan, usar un LEFT JOIN para unirlas también funciona, y ahora entiendo cómo unir múltiples selects de esta manera. ¡Gracias!
Pruebe 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
Si Age y Palt son columnas en la misma tabla, puede contar (*) todas las tareas y sumar solo las últimas como esta:
select ks,
count(*) tasks,
sum(case when Age > Palt then 1 end) late
from Table
group by ks
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 quieres 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
puede 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 como un Set Union y no da salida a valores duplicados
Para la diferencia con un ejemplo: http://sql-plsql.blogspot.in/2010/05/difference-between-union-union-all.html
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