/ / Problemi con raggruppamento per e ordine per - sql, sql-server

Problemi con raggruppamento per e ordine per - sql, sql-server

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 № 1
select  *
,       sum(amount) over (partition by project) as ProjAmount
,       row_number() over
from    YourTable
order by
ProjAmount desc

Esempio di SQL Fiddle.


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

Esempio di SQL Fiddle.


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

SQLFiddle


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