/ / TSQL: Registros de classificação usando diferentes colunas - tsql, join

TSQL: Ranking de registros usando diferentes colunas - tsql, join

Eu tenho uma mesa com pessoas e suas despesase algumas outras colunas. O que eu preciso é criar duas novas colunas: ranking1 e ranking2. Essas classificações são "calculadas" usando algumas colunas e usando agregados.

ranking1: if total of person expenses exceeds 1000 then ranking 1 else ranking 0
ranking2: (if Col1 = 1 then 0 else 5) + (if Col2 = 1 then 0 else 7) + (if Col3 = 1 then 5 else 10)

O que eu preciso é ter a tabela original (inalterada) com estas duas novas colunas que me dão a classificação para cada pessoa.

Minha consulta:

select Col1, Col2, Col3
((CASE Col1 = 1 THEN 0 ELSE 5 END) +
(CASE WHEN Col2 = 1 THEN 0 ELSE 7 END) +
(CASE WHEN Col3 = 1 THEN 5 WHEN Col3 = 2 THEN 2 ELSE 10 END)) as ranking, tmp.Expenses    from table t
left join (select id, Person,
(case when temp.expenses > 1000 then 1 else 0 end) as UserExpenses
from (select id, Person, sum(Expenses) as expenses
from table
group by id, Person) temp) tmp
on t.Person = tmp.Person and t.id = tmp.id
order by ranking desc, tmp.UserExpenses desc

Estou em dúvida se esta consulta me daráo que eu quero, que é a tabela inalterada original com duas novas colunas como ranking. Especialmente estou em dúvida sobre junção à esquerda, é a junção certa? desde já, obrigado

Respostas:

0 para resposta № 1

Sua consulta deve lhe trazer resultados corretos. Abaixo está uma versão simplificada da sua consulta:

select  Col1,
Col2,
Col3
(CASE WHEN Col1 = 1 THEN 0 ELSE 5 END) +
(CASE WHEN Col2 = 1 THEN 0 ELSE 7 END) +
(CASE WHEN Col3 = 1 THEN 5 WHEN Col3 = 2 THEN 2 ELSE 10 END) as ranking,
(case when temp.expenses > 1000 then 1 else 0 end) as Expenses
from [table] t
OUTER APPLY (select id,
Person,
sum(Expenses) as expenses
from [table]
where t.Person = Person and t.id = id
group by id, Person
) temp
order by ranking desc, temp.expenses desc