SQL-聚合函数-1211.查询结果的质量和占比

发布时间 2023-11-30 07:43:27作者: Offer多多

select
    query_name,
    round(avg(rating/position), 2) as quality,
    round(sum(rating<3)*100/count(query_name), 2) as poor_query_percentage
from Queries
group by query_name;

注意:

1. SUM函数是用于计算指定列中的所有数值的总和,是聚合函数之一,通常与group by子句一起使用,对数据进行分组和计算汇总值。

SUM(column_name)

例如:

SELECT SUM(salary) AS total_salary
FROM employees;

如果想按照某个列进行分组,并计算每个组的总和,可以结合使用sum和group by。

SELECT department, SUM(salary) AS department_salary
FROM employees
GROUP BY department;

在我们的 SQL 查询中,`SUM(rating < 3)` 的含义是计算满足条件 `rating < 3` 的行的数量。在这种情况下,它会将每一行的 `rating` 值是否小于 3 转换为布尔值(1 表示 true,0 表示 false),然后将这些值相加以计算满足条件的行的总数。

具体来说,`rating < 3` 的结果为布尔值(true 或 false),而在 SQL 中,true 被视为 1,false 被视为 0。因此,`SUM(rating < 3)` 的结果就是所有满足条件 `rating < 3` 的行的数量。

在你的查询中,这部分的目的是计算 `rating` 值小于 3 的行的数量,用于后续计算 `poor_query_percentage`,即差劲查询的百分比。

2. COUNT函数用于计算指定列中非NULL值的行数,通常与group by一起按组计数。 

COUNT(column_name)

column_name 是你要计算非NULL值行数的列的名称,或者你可以使用 * 来计算所有行的数量。

-- 计算 employees 表中的记录数量
SELECT COUNT(*) AS total_records
FROM employees;
-- 计算 department 列的不同值的数量,即部门的数量
SELECT COUNT(DISTINCT department) AS distinct_departments
FROM employees;

3. 为什么不使用count计算rating < 3的行数呢,因为在sql中“rating < 3”的结果是一个布尔值,true为1,false为0。如果使用COUNT(rating<3),则只会计数不为null的行,所有行都会被计数,结果错误。如果想用count实现相同的功能,可以使用如下的代码:

COUNT(CASE WHEN rating < 3 THEN 1 ELSE END)

case会检查每一行的rating是否小于3,如果是则返回1,否则返回null。

CASE是SQL中实现条件逻辑的表达式,有两种形式:

-- 简单形式
CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE else_result
END
  • condition1, condition2, ...:条件表达式,当某个条件为真时,对应的 result 将被返回。
  • result1, result2, ...:每个条件为真时返回的结果。
  • else_result:如果所有条件都不为真,则返回 else_result

例如:

SELECT
    column_name,
    CASE
        WHEN column_name > 0 THEN 'Positive'
        WHEN column_name < 0 THEN 'Negative'
        ELSE 'Zero'
    END AS category
FROM your_table;

这个查询使用 CASE 表达式根据列 column_name 的值判断其正负性,并返回相应的分类。

-- 搜索形式
CASE expression
    WHEN value1 THEN result1
    WHEN value2 THEN result2
    ...
    ELSE else_result
END
  • expression:要进行匹配的表达式。
  • value1, value2, ...:匹配表达式的值。
  • result1, result2, ...:每个匹配值对应的结果。
  • else_result:如果没有匹配的值,则返回 else_result

例如:

SELECT
    column_name,
    CASE column_name
        WHEN 1 THEN 'One'
        WHEN 2 THEN 'Two'
        ELSE 'Other'
    END AS number_word
FROM your_table;

此外mysql还有一些类似于if-else的语法,例如IF()函数:

SELECT
    column_name,
    IF(column_name > 0, 'Positive', 'Non-Positive') AS category
FROM your_table;

在这个例子中,IF() 函数接受一个条件和两个值,如果条件为真,则返回第一个值,否则返回第二个值。