在计算前替换列值

Replacing column values before calculation

我有 table 3 列 - 让它成为: - 订单数量(tck.TICKETID), - 表演者(perf.DISPLAYNAME), - 完成订单后对表演者工作的反馈。 我需要计算每个表演者的平均值来进行评分。 不难:

SELECT 
perf.DISPLAYNAME AS "Performer",
 AVG (tck.mark)
FROM ticket tck
LEFT JOIN (
select 
  displayname, personid,  tck.TICKETID FROM PERSON  per
  left join ticket tck on tck.owner = per.personid
) perf on tck.TICKETID= perf.TICKETID
WHERE 
      tck.MARK IS NOT NULL AND
      perf.DISPLAYNAME IS NOT NULL
GROUP BY  perf.DISPLAYNAME 
ORDER BY  AVG (tck.mark) desc;

但对我来说有一个问题 - maks 以相反的方式存储在数据库中,所以 1=5; 2=4; 3=3; 2=1

我需要在计算 AVG 值之前反转它,在 SELECT 中尝试使用 CASE:

CASE AVG(TO_NUMBER(tck.MARK))
    WHEN 1 THEN 5
    WHEN 2 THEN 4 
    WHEN 3 THEN 3 
    WHEN 4 THEN 2 
    ELSE 99
  END AS Mark

但案例在计算后有效,我需要在计算之前。在我看来,情况放错了,或者我解决任务的方法不是最佳的。

一如既往地非常感谢任何建议。

您只需将盒子放入 avg 即可获得您想要的东西。并且您需要确定您的 ELSE 值,因为如果 NULL/0 在当前查询中两者都将是 99

AVG(CASE 
WHEN TO_NUMBER(tck.MARK) = 1 THEN 5
WHEN TO_NUMBER(tck.MARK) = 2 THEN 4 
WHEN TO_NUMBER(tck.MARK) = 3 THEN 3 
WHEN TO_NUMBER(tck.MARK) = 4 THEN 2 
ELSE 99
END) AS Mark