Ciao, sono un principiante nel mondo di sql ma sto lottando per far funzionare alcune delle basi.
Ho un set di dati che assomiglia a questo:
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
Voglio che finisca così:
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
Ordinati per progetto con il massimo importo TOTALE
Raggruppa per non funziona per me poiché raggruppa tutti i progetti in uno, quindi non riesco a vedere le 3 righe dell'ordine di lavoro per "Progetto 111"
PROJECT WORK ORDER AMOUNT
-----------------------------------------
111 a 900
222 b 200
444 d 400
666 f 600
L'ordine per non funziona perché non riesco a risolverlo in base al valore più grande del progetto
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
La mia idea alternativa era se potessi crearne un altrocolonna "Importo del progetto" che calcola il totale dei progetti in base ai valori nella colonna "Progetto" e posso quindi facilmente ordinarlo per Importo del progetto anziché ottenere il formato desiderato
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
Ma sto lottando su come ottenere la colonna "Importo del progetto" per calcolare tutto il valore totale dei progetti e presentarli su tutte le righe che appaiono con lo stesso numero di progetto.
Qualche consiglio?
risposte:
4 per risposta № 1select *
, sum(amount) over (partition by project) as ProjAmount
, row_number() over
from YourTable
order by
ProjAmount desc
Per selezionare solo i primi due progetti con gli importi più elevati, è possibile utilizzare 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 per risposta № 2
Una versione con una semplice subquery SQL
SELECT s.*,
(SELECT SUM(Amount) FROM Sample WHERE Project = s.Project) ProjectAmount
FROM Sample s
ORDER BY ProjectAmount DESC
0 per risposta № 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