在计算之前替换列值

时间:2015-02-17 07:06:33

标签: sql oracle11g

我有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;

但是我有一个问题 - mak以相反的方式存储在数据库中,所以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

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

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

1 个答案:

答案 0 :(得分:1)

您可以将案例放入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