我有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
但是案例在计算之后有效,我之前需要。在我看来,情况是错误的,或者我解决问题的方法并不是最佳的。
一如既往地非常感谢任何建议。
答案 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