two SQL COUNT() queries?

前端 未结 5 429
时光取名叫无心
时光取名叫无心 2020-12-16 19:03

I want to count both the total # of records in a table, and the total # of records that match certain conditions. I can do these with two separate queries:

S         


        
相关标签:
5条回答
  • 2020-12-16 19:31

    if you are just counting rows you could just use nested queries.

    select 
        (SELECT COUNT(*) AS TotalCount FROM MyTable) as a,
        (SELECT COUNT(*) AS QualifiedCount FROM MyTable WHERE {conditions}) as b
    
    0 讨论(0)
  • 2020-12-16 19:33

    MySQL doesn't count NULLs, so this should work too:

    SELECT count(*) AS TotalCount, 
      count( if( field = value, field, null)) AS QualifiedCount 
      FROM MyTable {possible JOIN(s)} WHERE {some conditions}
    

    That works well if the QuailifiedCount field comes from a LEFT JOIN, and you only care if it exists. To get the number of users, and the number of users that have filled in their address:

    SELECT count( user.id) as NumUsers, count( address.id) as NumAddresses
      FROM Users
      LEFT JOIN Address on User.address_id = Address.id;
    
    0 讨论(0)
  • 2020-12-16 19:39

    In Sql Server or MySQL, you can do that with a CASE statement:

    select 
        count(*) as TotalCount,
        sum(case when {conditions} then 1 else 0 end) as QualifiedCount
    from MyTable
    

    Edit: This also works if you use a JOIN in the condition:

    select 
        count(*) as TotalCount,
        sum(case when {conditions} then 1 else 0 end) as QualifiedCount
    from MyTable t
    left join MyChair c on c.TableId = t.Id
    group by t.id, t.[othercolums]
    

    The GROUP BY is there to ensure you only find one row from the main table.

    0 讨论(0)
  • 2020-12-16 19:42

    One way is to join the table against itself:

    select
       count(*) as TotalCount,
       count(s.id) as QualifiedCount
    from
       MyTable a
    left join
       MyTable s on s.id = a.id and {some conditions}
    

    Another way is to use subqueries:

    select
       (select count(*) from Mytable) as TotalCount,
       (select count(*) from Mytable where {some conditions}) as QualifiedCount
    

    Or you can put the conditions in a case:

    select
       count(*) as TotalCount,
       sum(case when {some conditions} then 1 else 0 end) as QualifiedCount
    from
       MyTable
    

    Related:

    SQL Combining several SELECT results

    0 讨论(0)
  • 2020-12-16 19:47

    In Oracle SQL Developer I had to add a * FROM in my select, or else i was getting a syntax error:

    select * FROM 
        (select COUNT(*) as foo FROM TABLE1),
        (select COUNT(*) as boo FROM TABLE2);
    
    0 讨论(0)
提交回复
热议问题