Hola, soy un novato en el mundo de sql, pero estoy luchando para que funcionen algunos de los conceptos básicos.
Tengo un conjunto de datos que se parece a esto:
Table name: Sample
PROJECT WORK ORDER AMOUNT
-----------------------------------------
111 a 100
222 b 200
111 c 300
444 d 400
111 e 500
666 f 600
Quiero que termine luciendo así:
Table name: Sample
PROJECT WORK ORDER AMOUNT PROJECT AMOUNT
--------------------------------------------------------
111 e 500 900
111 c 300 900
111 a 100 900
666 f 600 600
444 d 400 600
222 b 200 200
Ordenado por proyecto con la mayor cantidad TOTAL
Agrupar por no me funciona porque agrupa todos los proyectos en uno, por lo que no puedo ver las 3 líneas de orden de trabajo para el "Proyecto 111".
PROJECT WORK ORDER AMOUNT
-----------------------------------------
111 a 900
222 b 200
444 d 400
666 f 600
Ordenar por no funciona porque no puedo resolverlo según el mayor valor del proyecto.
Table name: Sample
PROJECT WORK ORDER AMOUNT
-----------------------------------------
666 f 600
111 e 500
444 d 400
111 c 300
222 b 200
111 a 100
Mi idea alternativa era si podía crear otrocolumna "Monto del proyecto" que calcula el total del proyecto en función de los valores de la columna "Proyecto" y luego puedo ordenarlo fácilmente por Monto del proyecto para lograr el formato deseado
Table name: Sample
PROJECT WORK ORDER AMOUNT PROJECT AMOUNT
--------------------------------------------------------
111 e 500 900
111 c 300 900
111 a 100 900
666 f 600 600
444 d 400 600
222 b 200 200
Pero estoy luchando por cómo obtener la columna "Cantidad del proyecto" para calcular el valor total de todos los proyectos y presentarlos en cualquier fila que aparezca con el mismo número de proyecto.
¿Algún consejo?
Respuestas
4 para la respuesta № 1select *
, sum(amount) over (partition by project) as ProjAmount
, row_number() over
from YourTable
order by
ProjAmount desc
Para seleccionar solo los dos proyectos principales con las cantidades más altas, puede usar dense_rank
:
select *
from (
select *
, dense_rank() over (order by ProjAmount desc) as dr
from (
select *
, sum(amount) over (partition by project) as ProjAmount
from YourTable
) WithProjAmount
) WithDenseRank
where dr < 3
order by
ProjAmount desc
1 para la respuesta № 2
Una versión con subconsulta SQL simple
SELECT s.*,
(SELECT SUM(Amount) FROM Sample WHERE Project = s.Project) ProjectAmount
FROM Sample s
ORDER BY ProjectAmount DESC
0 para la respuesta № 3
SELECT a.project ,
a.work ,
a.amount ,
b.proj_amount
FROM project A
JOIN ( SELECT SUM(amount) proj_amount ,
project
FROM project
WHERE project = project
GROUP BY project
) b ON a.project = b.project
ORDER BY proj_amount DESC ,
amount DESC