Solía usar mucho SAS. Esto es molesto para mí al intentar hacer esto en Access 2016. Ejemplo de tabla:

ID        Name      Sport
__________________________
99       Jack         Soccer
99       Jack Jim     Baseball
54       Bob          Basketball      

Quiero seleccionar *, contar el ID y agrupar por ID, para poder agregar un lugar donde mostrar ID duplicados debido a una coincidencia cartesiana.

Lo que quiero es esto:

ID        Name      Sport          ID_Count
______________________________________________
99       Jack         Soccer           2
99       Jack Jim     Baseball         2  
54       Bob          Basketball       1

Sin embargo, recibo el mensaje de que no puedo agrupar por *, porque por alguna razón no es posible fusionar estadísticas de resumen, pero los productos cartesianos en otros casos sí lo son. ¿Hay una solución para esto?

0
user5509289 18 oct. 2017 a las 21:38

3 respuestas

La mejor respuesta

Puedes probar esto en tu ms access 2016:

Select yourtable.*, q1.ID_Count from yourtable 
join (select id, count(id) as ID_Count from yourtable group by id having count(id)>1) q1 
on yourtable.id = q1.id
0
Md. Suman Kabir 18 oct. 2017 a las 19:01

¿Por qué usar * cuando puedes enumerar tus campos y seguir usando el grupo?

SELECT ID, Name, Sport, Count([ID]) as [ID_Count]
FROM TableName
GROUP BY ID, Name, Sport

Me mantendría alejado de intentar usar * en un grupo por consulta en MS Access. Podría complicar tareas simples.

0
Chris 18 oct. 2017 a las 23:30

El resurgimiento de resultados de agregación de SAS en proc sql es una sintaxis no estándar. SQL estándar admite funciones de ventana, que hacen esto. Por desgracia, MS Access no es compatible con esta funcionalidad estándar.

Un método similar es un JOIN en una consulta de agregación o una subconsulta correlacionada:

select t.*,
       (select count(*) from t t2 where t2.id = t.id) as id_count
from t;

La funcionalidad estándar ANSI es:

select t.*, count(*) over (partition by id) as id_count
from t;
1
Gordon Linoff 18 oct. 2017 a las 18:40