Sql 有关于和列的子句

Sql 有关于和列的子句,sql,hsqldb,Sql,Hsqldb,我想在我的score列上设置一个条件,我从sum中得到这个条件,但是如果我把score=

我想在我的score列上设置一个条件,我从sum中得到这个条件,但是如果我把score=<1放在groupby之后,它就不起作用了。那就必须向我展示那些得分很高的项目。我正在使用hsqldb,出了什么问题?我得到“用户缺少权限或找不到对象:分数”

SELECT p.id, p.project_name, SUM(CASE r.type_code 
    WHEN 'GOOD' THEN  1 
    WHEN 'VERY_GOOD' THEN  1 
    WHEN 'BAD' THEN -1 
    WHEN 'VERY_BAD' THEN -1 
    ELSE 0 END) AS score
FROM record_project AS rp
JOIN project AS p ON p.id = rp.project_id 
JOIN record AS r ON r.id = rp.record_id 
GROUP BY p.id, p.project_name
HAVING score =< 1        <<<---- wrong?!
ORDER BY score DESC LIMIT 1

您应该使用整个计算列

SELECT p.id, p.project_name,
       SUM(CASE WHEN r.type_code IN ('GOOD','VERY_GOOD') THEN 1
                WHEN r.type_code IN ('BAD','VERY_BAD') THEN -1
                ELSE 0 END) score
FROM   record_project AS rp
       JOIN project AS p ON p.id = rp.project_id 
       JOIN record AS r ON r.id = rp.record_id 
GROUP  BY p.id, p.project_name
HAVING SUM(CASE WHEN r.type_code IN ('GOOD','VERY_GOOD') THEN 1
                WHEN r.type_code IN ('BAD','VERY_BAD') THEN -1
                ELSE 0 END) <= 1
ORDER  BY score DESC 
-- LIMIT  1

您应该使用整个计算列

SELECT p.id, p.project_name,
       SUM(CASE WHEN r.type_code IN ('GOOD','VERY_GOOD') THEN 1
                WHEN r.type_code IN ('BAD','VERY_BAD') THEN -1
                ELSE 0 END) score
FROM   record_project AS rp
       JOIN project AS p ON p.id = rp.project_id 
       JOIN record AS r ON r.id = rp.record_id 
GROUP  BY p.id, p.project_name
HAVING SUM(CASE WHEN r.type_code IN ('GOOD','VERY_GOOD') THEN 1
                WHEN r.type_code IN ('BAD','VERY_BAD') THEN -1
                ELSE 0 END) <= 1
ORDER  BY score DESC 
-- LIMIT  1
您可以将HAVING合并为子查询上的WHERE:

SELECT * FROM ( 
  SELECT p.id, p.project_name, SUM(CASE r.type_code 
    WHEN 'GOOD' THEN  1 
    WHEN 'VERY_GOOD' THEN  1 
    WHEN 'BAD' THEN -1 
    WHEN 'VERY_BAD' THEN -1 
    ELSE 0 END) AS score
  FROM record_project AS rp
  JOIN project AS p ON p.id = rp.project_id 
  JOIN record AS r ON r.id = rp.record_id 
  GROUP BY p.id, p.project_name) x
WHERE score =< 1
ORDER BY score DESC
LIMIT 1
您可以将HAVING合并为子查询上的WHERE:

SELECT * FROM ( 
  SELECT p.id, p.project_name, SUM(CASE r.type_code 
    WHEN 'GOOD' THEN  1 
    WHEN 'VERY_GOOD' THEN  1 
    WHEN 'BAD' THEN -1 
    WHEN 'VERY_BAD' THEN -1 
    ELSE 0 END) AS score
  FROM record_project AS rp
  JOIN project AS p ON p.id = rp.project_id 
  JOIN record AS r ON r.id = rp.record_id 
  GROUP BY p.id, p.project_name) x
WHERE score =< 1
ORDER BY score DESC
LIMIT 1

好的,那就行了,但是我怎么能按分数排序,这样我就总是把最高的那一行作为第一行呢?你现在可以使用别名了。我会更新我的答案。好的,这是可行的,但我如何按分数排序,这样我就可以始终将最高的作为第一行?现在您可以使用别名了。我会更新我的答案。