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"?
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
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;
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