with inner sql select join group-by

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



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