none
DUDA CON QUERY SQL UTILIZANDO GROUP BY RRS feed

  • Pregunta

  • Buenas tardes a Todos.

    Como siempre pidiendo su ayuda por favor.

    En una Tabla de una Base de Datos de Sql Server 2008, llamada registro_becas, el indice compuesto es con tres campos (folio, rfc, fecha_cap) (int, varchar, date). ademas de más campos que componen esta tabla;

    Sin consulto todos los registros de este año ordenado por rfc, además de otras condiciones, todo se muestra perfectamente; PERO AHI VIENE EL PROBLEMA.

    en esta consulta hay un aproximado a 126 registros, algunos se repiten con el rfc pero el folio y fecha son diferentes, como por ejemplo:

    folio    rfc   fecha

    14 MASS721125DM1  01-03-2013  

    150 MASS721125DM1 25-03-2013

    190 MASS721125DM1 15-04-2013

    al momento de tratar de agrupar toda la consulta,  para que sean únicos los registro marca el siguiente error

    La columna 'registro_becas.folio' 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.

    ¿como tienen que ser la consulta?

    mi consulta como ejemplo es la siguiente:

    select * from registro_becas where (tipo_beca='Prórroga' or tipo_beca='Inicial' or  tipo_beca='Extensión') and termina=terminaBeca and year(fecha_cap)=2013 order by rfc (aqui es dónde al anteponer ORDER BY RFC, tengo el error)

    Espero haber sido claro en lo que necesito, les agradezco su tiempo, esperando su respuesta, que tengan un feliz fin de semana.

    gracias



    viernes, 26 de abril de 2013 22:50

Respuestas

  • Sergio... el diseño de tu tabla está mal, no tienes una llave primaria, puedes indicarnos cual sería tu llave primaria ?? tampoco te va a funcionar el GROUP BY porque lo que tu necesitas es eliminar duplicados, por eso te comentaba que nos proporcionaras el recordset que esperas obtener como resultado. Eso lo puedes obtener con un ROW_NUMBER, pero por ejemplo de esos dos registros que estas sombreando, cual de ellos te debes de traer ?

    Sergio Sánchez Arias
    AYÚDANOS A AYUDARTE

    lunes, 29 de abril de 2013 18:19

Todas las respuestas

  • Hola que tal:

    Al parecer esa consulta que nos muestras no es la que te está arrojando ese error, porque ? la razón es porque es error nos lo muestra cuando se utiliza la instrucción GROUP BY sobre una o varias columnas y en la lista de columnas del SELECT no están siendo declaradas con una función de agregación aquellas columnas que no estén en tu lista de columnas del GROUP BY, tal vez confuso te lo voy a explicar con ejemplos

    Ejemplo válido:

    SELECT col1, col2, SUM( col3 ) as sumCol3, AVG( col4 ) as avgCol4
    FROM tuTabla
    GROUP BY col1, col2


    Inválidos:

    Si tu tabla contiene más de 2 columnas, lo siguiente sería inválido.

    SELECT *
    FROM tuTabla 
    GROUP BY col1
    

    En el siguiente ejemplo col2 no está definido en la lista de columnas del GROUP BY 

    SELECT col1, col2, SUM( col3 ) as sumCol3, AVG( col4 ) as avgCol4
    FROM tuTabla
    GROUP BY col1

    Por lo tanto te marcaría un error como el que nos comentas.

    En el query que nos posteas, no hay GROUP BY.

    No comprendo cual es el resultado que esperas obtener, pero para aplicar un correcto uso del GROUP BY utilizando los datos que nos facilitas sería algo así:

    SELECT rfc, COUNT( rfc ) as countRFC
    FROM registro_becas
    WHERE (tipo_beca='Prórroga' or tipo_beca='Inicial' or  tipo_beca='Extensión') 
    	and termina=terminaBeca and year(fecha_cap)=2013 
    GROUP BY rfc
    ORDER BY rfc

    El query que nos presentas, a simple vista te podría decir que no tiene error, pero si nos regalas el script de tu tabla con los datos en forma de INSERTs para poder reproducir tu escenario, sería mucho más fácil ofrecerte una respuesta más acertada.

    PD: No te olvides de mostrarnos cual es el resultado que esperas obtener con el query.

    SALUDOS!


    Sergio Sánchez Arias
    AYÚDANOS A AYUDARTE

    viernes, 26 de abril de 2013 23:10
  • Hola las columnas de tu tabla registro_becas.Folio deberá de ir así:

    Group By registro_becas.Folio, registro_becas.rfc,registro_becas.fecha_cap

    El Group By debe estar antes del Order By


    Si se solucionó tu consulta no olvides marcar la respuesta. Saludos

    viernes, 26 de abril de 2013 23:13
  • ok, espero me disculpen mi ignorancia, pero apenas se me esta presentando este problema, les mando tres imágenes la primera, es la estructura de la tabla con el índice compuesto, la segunda imagen es la consulta a simple vista sin errores, pero ahí se identifican como ejemplo dos reglones que se repiten y hay que agruparlos (no sería en único caso) y la tercer imagen es el error que no se como resolverlo.

    Agradezco su ayuda, saludos y espero sus comentarios.

    la tercera la mando en otra publicación

    lunes, 29 de abril de 2013 14:50
  • aquí va la tercera imagen

    lunes, 29 de abril de 2013 14:51
  • buenos días ya lo intente y no queda, te mando la imagen.

    saludos y gracias

    lunes, 29 de abril de 2013 14:52
  • Hola si Registro_Becas.id_Modalidad lo colocas dentro de la cláusula Group By que error te devuelve?

    Group By registro_becas.Folio, registro_becas.rfc,registro_becas.fecha_cap,registro_becas.id_modalidad


    Si se solucionó tu consulta no olvides marcar la respuesta. Saludos

    lunes, 29 de abril de 2013 14:55
  • Como te decía Sergio, el GROUP BY en SQL SERVER no funciona de la misma manera que en MySQL, aquí haces un SELECT * y solo agrupas por folio, rfc y fecha_Recibe , tus columnas que no estén en está lista y se encuentren en tu lista de columnas del SELECT, les debes( y es necesario ) aplicar una función de agregado como AVG, COUNT, MAX, MIN, SUM, etc etc... si no, no va a funcionar y te marcará ese error....

    Un ejemplo para que no te marque error sería así:

    select folio, rfc, fecha_Recibe -- Estas son las columnas de tu lista de GROUP BY 
    -- Y aquí las columnas que no estén en tu GROUP BY debes aplicar funciones de agregado.
    , MAX(nombreCol1) as alias1
    , COUNT(nombreCol2) as alias2
    from
    registro_becas 
    where (tipo_beca='Prórroga' or tipo_beca='Inicial' or  tipo_beca='Extensión') 
    and termina=terminaBeca and year(fecha_cap)=2013 
    group by folio, rfc, fecha_Recibe
    order by rfc

    Como los BOL lo indican, lo que tu quieres hacer no está permitido, observa el siguiente LINK: 

    Agrupar filas con GROUP BY


    Sergio Sánchez Arias
    AYÚDANOS A AYUDARTE

    • Propuesto como respuesta José Barba lunes, 29 de abril de 2013 15:03
    lunes, 29 de abril de 2013 14:58
  • me pide el campo siguiente, y si anexo el que menciona, sigue y sigue pidiendo en el orden como esta la estructura de la tabla el campo siguiente.

    lunes, 29 de abril de 2013 15:02
  • Así es tal y como comenta Sergio todas las columnas necesarias deberá de estar dentro de la cláusula Group By

    Si se solucionó tu consulta no olvides marcar la respuesta. Saludos

    lunes, 29 de abril de 2013 15:03
  • En base a la imagen que muestra de tu tabla, cual es el resultado que esperas obtener ??? para poder ofrecerte una respuesta más específica


    Sergio Sánchez Arias
    AYÚDANOS A AYUDARTE

    lunes, 29 de abril de 2013 15:12
  • Como te indicó Sergio deberás colocar todos si es necesario, ya que estás haciendo un Select *

    Si se solucionó tu consulta no olvides marcar la respuesta. Saludos


    lunes, 29 de abril de 2013 15:15
  • cómo lo mandé en la imagen 2, necesito quitar los campos rfc repetidos, no importando cuál quede, simplemente que no se repitan
    lunes, 29 de abril de 2013 15:32
  • sin embargo ya pregunte que campos son lo que se necesitan mostrar en pantalla y no son todos, solamente son 13 campos
    lunes, 29 de abril de 2013 15:33
  • Mmmm por lo que entiendo quieres quitar duplicados entonces, puedes aplicar o bien un DISTINCT o un ROW_NUMBER()

    Sergio Sánchez Arias
    AYÚDANOS A AYUDARTE

    lunes, 29 de abril de 2013 15:44
  • Hola si solo debes mostrar 13 campos de tu tabla colócalos en el Select y agrégalos dentro de la cláusula Group By


    Si se solucionó tu consulta no olvides marcar la respuesta. Saludos

    lunes, 29 de abril de 2013 15:45
  • sigue igual el problemita; ¿qué estoy haciendo mal?

    lunes, 29 de abril de 2013 18:10
  • Sergio... el diseño de tu tabla está mal, no tienes una llave primaria, puedes indicarnos cual sería tu llave primaria ?? tampoco te va a funcionar el GROUP BY porque lo que tu necesitas es eliminar duplicados, por eso te comentaba que nos proporcionaras el recordset que esperas obtener como resultado. Eso lo puedes obtener con un ROW_NUMBER, pero por ejemplo de esos dos registros que estas sombreando, cual de ellos te debes de traer ?

    Sergio Sánchez Arias
    AYÚDANOS A AYUDARTE

    lunes, 29 de abril de 2013 18:19
  • Hola:

    Los campos que son diferentes deben estar en el group by

    Select rfc, count(rfc) as conteo_rfc

    from tabla

    group by rfc

    si agregas otro campo en las lista select, debes igual agregarlo en el group by

    martes, 30 de abril de 2013 17:33