none
Consulta sobre Group By RRS feed

  • Pregunta

  • Ejemplo en esta consulta, Por que Group by no me permite filtrar solo por nombreboleta?


    select codigoboleta,nombreboleta,marcaboleta,cantidadboleta,pcompratot
    from ventaboletarepuestos
    group by nombreboleta

    Me dice este error:

    La columna 'ventaboletarepuestos.codigoboleta' de la lista de selección no es válida, porque no está contenida en una función de agregado ni en la cláusula GROUP BY.

    Saludos.

    sábado, 19 de diciembre de 2015 2:54

Respuestas

  • Hola AlexisMolina,

    La pregunta inicial es: ¿por qué quieres agrupar? ¿Para mostrar valores únicos? ¿Para operar los grupos con funciones (suma, promedio, máximo, mínimo, etc)?

    Intenta seguir el ejercicio que te adjunto, espero quede claro tus dudas:

    DECLARE @Ventas table (ZonaVentas nvarchar(100), Cliente nvarchar(100), Mes tinyint, Monto decimal(9,2));
    INSERT INTO @Ventas VALUES
    	('NORTE', 'JUAN PABLO', 1, 100),
    	('NORTE', 'JUAN PABLO', 1, 150),
    	('NORTE', 'JUAN PABLO', 2, 200),
    	('NORTE', 'JUAN PABLO', 2, 300),
    	('NORTE', 'MARÍA CARRILLO', 1, 200),
    	('NORTE', 'MARÍA CARRILLO', 2, 300),
    	('SUR', 'MARIO SALAS', 1, 100),
    	('SUR', 'MARIO SALAS', 1, 200),
    	('SUR', 'MARIO SALAS', 2, 300);
    
    /*MOSTRAR LAS ZONAS Y CLIENTES POR ZONA*/
    /*DISTINCT RETORNA FILAS CON VALORES ÚNICOS*/
    SELECT DISTINCT ZonaVentas, Cliente FROM @Ventas;
    
    /*TAMBIÉN PUEDO USAR GROUP BY*/
    SELECT ZonaVentas, Cliente FROM @Ventas GROUP BY ZonaVentas, Cliente;
    
    /*¿PERO QUE OCURRE SI ADEMÁS QUIERO MOSTRAR EL MES Y EL MONTO?*/
    /*No puedes ponerlo en la lista de selección porque para el grupo NORTE/JUAN PABLO existen los meses 1 y 2*/
    /*¿Quieres agrupar por mes?*/
    SELECT ZonaVentas, Cliente, Mes FROM @Ventas GROUP BY ZonaVentas, Cliente, Mes;
    
    /*Cómo verás sólo puedo mostrar en la lista de selección los campos que tengo agrupados*/
    /*Pero de los grupos formados puedo obtener la sumatoria de las ventas*/
    SELECT ZonaVentas, Cliente, Mes, SUM(Monto) [Sumatoria] FROM @Ventas GROUP BY ZonaVentas, Cliente, Mes;
    
    /*En el ejemplo anterior no necesite colocar el campo [Monto] en la lista de agrupación porque del conjunto agrupado use una función de agregación*/
    /*¿Puedo mostrar el total por zona?*/
    SELECT ZonaVentas, SUM(Monto) [Sumatoria] FROM @Ventas GROUP BY ZonaVentas;

    • Marcado como respuesta Tronxs domingo, 20 de diciembre de 2015 0:07
    sábado, 19 de diciembre de 2015 22:31

Todas las respuestas

  • Buenas Alexis, siempre cuando uses Group by debes de poner todos los campos que tengas en tu SELECT. Si quieres agrupar por nombreboleta puedes usar esta consulta

    SELECT Codigoboleta, Nombreboleta, Marcaboleta, Cantidadboleta, Pcompratot
    from ventaboletarepuestos
    Group by Nombreboleta, Marcaboleta, Cantidadboleta, Pcompratot,Codigoboleta

    sábado, 19 de diciembre de 2015 4:18
  • Siempre se ponen los mismos campos del select en el group by?

    Entonces si quiero agrupar por Nombreboleta, en el Group by solo tengo que poner dicha columna de las primeras?

    Es decir el Group by va agrupando por el orden en que se vayan colocando las columnas?, es decir si coloco primero en el Group by Marcaboleta agrupara por Marcaboleta?

    Saludos.

    sábado, 19 de diciembre de 2015 4:22
  • Hola AlexisMolina,

    El mensaje de error marca exactamente lo que viene aconteciendo: Group By está formando grupos a razón de la igualdad en los valores de la columna [nombreboleta], los grupos formados podrían contener valores distintos para las demás columnas y es ahí donde se debe tomar una decisión:

    1. ¿Quieres agrupar por las demás columnas?
    2. ¿Quieres usar funciones de agregación para resumir los valores de las demás columnas?
    3. ¿Quieres hacer un mixing de los puntos 1 y 2?

    El camino a seguir depende de lo que desees obtener, puedes agrupar por las columnas [codigoboleta], [nombreboleta] y [marcaboleta] y por cada grupo formado puedes mostrar la sumatoria de las columnas [cantidadboleta] y [pcompratot], reitero, la consulta final dependerá estrictamente según lo que quieras obtener.

    SELECT 
    	codigoboleta,
    	nombreboleta,
    	marcaboleta,
    	SUM(cantidadboleta),
    	SUM(pcompratot)
    FROM 
    	ventaboletarepuestos
    GROUP BY 
    	codigoboleta,
    	nombreboleta,
    	marcaboleta;


    sábado, 19 de diciembre de 2015 5:24
  • Mi pregunta final es:

    Entonces las columnas que se colocan en el select deben ir las mismas en el Group by?

    En el ejemplo que diste eso veo. Colocaste codigoboleta,nombreboleta y marcaboleta. Tuviste que poner esas mismas en el group by.  

    Entonces si en el select estan esas 3 columnas, en el group by no se puede poner solo una ?

    Me podrias dar un ejemplo del punto 1,2 y 3 que planteas por favor?

    • Editado Tronxs sábado, 19 de diciembre de 2015 22:08
    sábado, 19 de diciembre de 2015 22:07
  • Hola AlexisMolina,

    La pregunta inicial es: ¿por qué quieres agrupar? ¿Para mostrar valores únicos? ¿Para operar los grupos con funciones (suma, promedio, máximo, mínimo, etc)?

    Intenta seguir el ejercicio que te adjunto, espero quede claro tus dudas:

    DECLARE @Ventas table (ZonaVentas nvarchar(100), Cliente nvarchar(100), Mes tinyint, Monto decimal(9,2));
    INSERT INTO @Ventas VALUES
    	('NORTE', 'JUAN PABLO', 1, 100),
    	('NORTE', 'JUAN PABLO', 1, 150),
    	('NORTE', 'JUAN PABLO', 2, 200),
    	('NORTE', 'JUAN PABLO', 2, 300),
    	('NORTE', 'MARÍA CARRILLO', 1, 200),
    	('NORTE', 'MARÍA CARRILLO', 2, 300),
    	('SUR', 'MARIO SALAS', 1, 100),
    	('SUR', 'MARIO SALAS', 1, 200),
    	('SUR', 'MARIO SALAS', 2, 300);
    
    /*MOSTRAR LAS ZONAS Y CLIENTES POR ZONA*/
    /*DISTINCT RETORNA FILAS CON VALORES ÚNICOS*/
    SELECT DISTINCT ZonaVentas, Cliente FROM @Ventas;
    
    /*TAMBIÉN PUEDO USAR GROUP BY*/
    SELECT ZonaVentas, Cliente FROM @Ventas GROUP BY ZonaVentas, Cliente;
    
    /*¿PERO QUE OCURRE SI ADEMÁS QUIERO MOSTRAR EL MES Y EL MONTO?*/
    /*No puedes ponerlo en la lista de selección porque para el grupo NORTE/JUAN PABLO existen los meses 1 y 2*/
    /*¿Quieres agrupar por mes?*/
    SELECT ZonaVentas, Cliente, Mes FROM @Ventas GROUP BY ZonaVentas, Cliente, Mes;
    
    /*Cómo verás sólo puedo mostrar en la lista de selección los campos que tengo agrupados*/
    /*Pero de los grupos formados puedo obtener la sumatoria de las ventas*/
    SELECT ZonaVentas, Cliente, Mes, SUM(Monto) [Sumatoria] FROM @Ventas GROUP BY ZonaVentas, Cliente, Mes;
    
    /*En el ejemplo anterior no necesite colocar el campo [Monto] en la lista de agrupación porque del conjunto agrupado use una función de agregación*/
    /*¿Puedo mostrar el total por zona?*/
    SELECT ZonaVentas, SUM(Monto) [Sumatoria] FROM @Ventas GROUP BY ZonaVentas;

    • Marcado como respuesta Tronxs domingo, 20 de diciembre de 2015 0:07
    sábado, 19 de diciembre de 2015 22:31