【问题标题】:SQL: Calculate the rating based on different columns and use it as an argumentSQL:根据不同的列计算评分并将其用作参数
【发布时间】:2022-01-23 08:10:21
【问题描述】:

我正在尝试根据一个表计算评分,该表有 3 列,评分范围从 1 到 5。

我想计算这 3 个值的平均值,然后能够将其用作查询中的参数,例如:

评分>3.5

目前,我有这个给我所有供应商的平均值

SELECT c.Name
    ,(SELECT CAST(AVG(rat) AS DECIMAL(5, 2))
        FROM(
            VALUES(b.Qty_Price),
                  (b.Quality),
                  (b.DeliveryTime)) A (rat))  AS Rating
FROM Order a
JOIN Evaluation b ON b.ID_Evaluation  = a.ID_Evaluation 
JOIN Supplier c ON c.NIF_Supplier = a.NIF_Supplier

例如,我现在想要过滤评级超过 3 的提供商,但我不知道该怎么做。如果有人可以帮助我将不胜感激

【问题讨论】:

  • 能否以表格形式给出样本数据和样本结果?

标签: sql average rating


【解决方案1】:

如果查询如您所愿,您将获得所有条目的平均值。

无法添加WHERE rating > 3.5 ,因为rating 不存在于SELECT-子句的上下文中,也不存在我们JOIN 的表。

为了克服这个问题,我们可以保留您所做的查询,使用 WITHSELECT 与该子查询 WHERE rating > 3.5 命名不同

它应该看起来像这样:

WITH Averages(name, rating) AS
  (SELECT c.name
  ,(SELECT CAST(AVG(rat) AS DECIMAL(5, 2))
  FROM(
        VALUES(b.qty_Price),
              (b.quality),
              (b.deliveryTime)) AS (rat))  AS rating
  FROM Order a
  JOIN Evaluation b ON b.ID_Evaluation  = a.ID_Evaluation 
  JOIN Supplier c ON c.NIF_Supplier = a.NIF_Supplier)

SELECT name, rating FROM Averages WHERE rating > 3.5;

现在,我们只需将您提供的查询称为Averages,然后我们从该表中SELECT WHERE rating > 3.5

还请注意,您可以拥有多个WITHs 以使您的操作更轻松,但请记住需要逗号 (,) 来分隔它们。在我们的例子中,我们只有 1 次使用 WITH ... AS,所以在 ...= a.NIF_Supplier) 之后不需要逗号或分号

看起来您在“(rat)”之前只输入了“A”,应该是“AS”。另外,请记住,属性应该是小写的,这样我们就更容易区分表格和属性了。

干杯!

【讨论】:

  • 嗨,我的朋友,感谢您的回答,但它不起作用。当您进行“AS 评级”时,我们只是创建一个别名,我们不能将其用作 WHERE 子句中的参数
  • 哦不,你是对的!我们可以做的是为您的子查询使用WITH-子句-SELECT CAST...。然后,我们从中选择WHERE rating > 3.5。我会修改我的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 2023-02-12
  • 2014-06-19
相关资源
最近更新 更多