【问题标题】:Implementing Count Function In SQL Query With Inner Joins使用内连接在 SQL 查询中实现计数函数
【发布时间】:2020-04-27 22:35:45
【问题描述】:

我有一个查询如下:

 select person.ID, person.personName, round(avg(TIMESTAMPDIFF(DAY,orderDate,shippedDate)),2)) as 'Average' from orders inner join person person.personID= orders.personID where shippedDate is not null group by orders.personID;

上面的查询输出 10 行。我想添加一个字段来计算上面查询中总共有多少行。

我尝试实现 SQL COUNT 函数,但由于它有一个 INNER JOIN,所以我在语法上遇到了困难。

【问题讨论】:

    标签: mysql sql join group-by count


    【解决方案1】:

    如果您运行的是 MySQL 8.0,则可以进行窗口计数:

    select 
        person.ID, 
        person.personName, 
        round(avg(timestampdiff(day, o.orderDate, o.shippedDate)),2)) average,
        count(*) over() total_no_rows
    from orders o
    inner join person p on p.personID = o.personID 
    where o.shippedDate is not null 
    group by p.personID, o.personName
    

    请注意,我对您的查询做了一些修正:

    • 表别名使查询更易于读写

    • 最好使用它们所属的表来限定所有列名 - 我做了一些假设,您可能需要检查一下

    • 每个非聚合列都应该属于group by 子句(这是一种很好的做法,也是大多数数据库的要求)

    【讨论】:

    • 感谢您的建议。你帮了大忙
    【解决方案2】:

    如果您不使用 Mysql 8.0,您可以使用子查询:

    select COUNT(*) FROM (
      person.ID,
      person.personName, 
      round(avg(TIMESTAMPDIFF(DAY,orderDate,shippedDate)),2)) as 'Average' from 
      orders inner join person person.personID= orders.personID where shippedDate 
      is not null group by orders.personID
    );
    

    如果您使用的是 MYSQL 8.0,请使用如下窗口函数:

    select 
        person.ID, 
        person.personName, 
        round(avg(timestampdiff(day, o.orderDate, o.shippedDate)),2)) average,
        count(*) over() total_no_rows
    from orders o
    inner join person p on p.personID = o.personID 
    where o.shippedDate is not null 
    group by p.personID, o.personName
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      • 2017-01-31
      相关资源
      最近更新 更多