Como conta () trabalhar em sql em um grupo por Declaração

no seguinte:

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;

A contagem ( * ) na instrução select será o total dos registos, ou os registos dentro de cada valor de "tipo"?

Author: wida norse, 2018-03-28

3 answers

Todas as funções de agregação(sum, count, avg, max (') são calculados por grupo. Se a consulta não contém uma cláusula group by, Então todo o conjunto de resultados é considerado como um grupo (o único grupo na consulta).

Isto significa que dado o seguinte quadro:

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)

Esta instrução de selecção:

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

Resultará em:

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

E este:

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

Resultará em:

Count(*)
9

Você pode ver uma demo ao vivo em rextester.

 3
Author: Zohar Peled, 2018-03-28 14:17:55

A contagem (*) na instrução selecionada dará o número de registros dentro de cada valor de "tipo""

Tipo

Table
    id name
    1  a
    2  b
    3  b
    4  a
    5  c

Select Count(*) From Table Group By name;
Output> 2
        2
        1

Explicação

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

Outro Exemplo

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 

Se quiser contar todos os registos

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;
 2
Author: Jay Shankar Gupta, 2018-03-28 14:31:26

Sim, você vai ter a contagem de linha para cada tipo. O seu cálculo aqui é o mesmo que usar a função agregada avg().

Exemplo:

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;

Resultado:

Salary_Group=Group1 sum_by_count=100 average=100 
Salary_Group=Group2 sum_by_count=20 average=20 
 0
Author: momo1644, 2018-03-28 14:45:16