【问题标题】:How does count() work in sql in a group by statementcount() 如何在 sql 中的 group by 语句中工作
【发布时间】:2018-03-28 14:01:39
【问题描述】:

如下:

proc sql;
    create table example as
    select type, sum(var1)/count(*) as s1, sum(var2)/count(*) as s2, sum(var3)/count(*) as v3
    from dataset
    group by type;
quit;

select语句中的count(*)是记录总数,还是每个“type”值内的记录?

【问题讨论】:

    标签: sql group-by sas summary summarization


    【解决方案1】:

    按组计算所有聚合函数(sumcountavgmax 等)。 如果查询不包含group by 子句,则将整个结果集视为一个组(查询中的单个组)。

    这意味着给定下表:

    DECLARE @T AS TABLE
    (
        grp int,
        col int
    )
    
    INSERT INTO @T VALUES
    (1, 1), (1, 2), (1, 3),
    (2, 1), (2, 2),
    (3, 1), (3, 2), (3, 3), (4, 4)
    

    这个选择语句:

     SELECT grp, COUNT(*) As [Count(*)]
     FROM @T 
     GROUP BY grp
    

    结果是:

    grp Count(*)
    1   3
    2   2
    3   3
    4   1
    

    还有这个:

    SELECT COUNT(*) As [Count(*)]
    FROM @T 
    

    结果是:

    Count(*)
    9
    

    You can see a live demo on rextester.

    【讨论】:

      【解决方案2】:

      select语句中的count(*)会给出每个“type”值内的记录计数

      喜欢

      Table
          id name
          1  a
          2  b
          3  b
          4  a
          5  c
      
      Select Count(*) From Table Group By name;
      Output> 2
              2
              1
      

      解释

      As a and b is having 2 count and c is having 1
      

      另一个例子

      Create table test(
      id int,
      name char(30)
      );
      insert into test
      values(1,'a'),(2,'a'),(3,'b'),(4,'b'),(5,'c');
      
      Select SUM(id)
      from test
      group by name;
      Select '---------------';
      Select count(*)
      from test
      group by name;
      Select '---------------';
      Select SUM(id)/count(*)
      from test
      group by name;
      Select '---------------';
      Select SUM(id)/(Select count(*) From test)
      from test
      group by name;
      
      output>
      3
      7
      5
      ---------------
      2
      2
      1
      ---------------
      1.5000
      3.5000
      5.0000
      ---------------
      0.6000
      1.4000
      1.0000 
      

      如果你想要所有记录计数

      proc sql;
          create table example as
          select type, 
                 sum(var1)/(Select Count(*) From dataset) as s1, 
                 sum(var2)/(Select Count(*) From dataset) as s2, 
                 sum(var3)/(Select Count(*) From dataset) as v3
          from dataset
          group by type;
      quit;
      

      【讨论】:

      • 第一个陈述似乎是错误的。首先它与原始查询的格式不匹配,因为type 变量未包含在选择列表中。我猜一些 DBMS 可能会给出组数的计数,但在 SAS 中,即使变量列表中没有包含 type,您仍然会得到每个值的计数 type
      【解决方案3】:

      是的,您将获得每种类型的行数。此处的计算与使用avg() 聚合函数相同。

      例子:

      data work.have;
      input Salary_Group $ Value;
      datalines;
      Group1 100
      Group1 100
      Group1 100
      Group1 100
      Group2 20
      Group2 20
      ;
      run;
      
      proc sql;
      create table example as 
      select Salary_Group , sum(value)/count(*) as sum_by_count , avg(value) as average
      from have 
      group by Salary_Group;
      quit;
      

      输出:

      Salary_Group=Group1 sum_by_count=100 average=100 
      Salary_Group=Group2 sum_by_count=20 average=20 
      

      【讨论】:

        猜你喜欢
        • 2021-02-03
        • 2011-08-31
        • 2012-10-20
        • 2017-08-15
        • 2012-11-23
        • 2014-05-15
        • 1970-01-01
        • 2011-02-12
        相关资源
        最近更新 更多