none
Dudas GROUP BY RRS feed

  • Pregunta

  • Hola, Group by siempre me deja con dudas... A ver si me podéis ayudar un poco.

    Por ejemplo, tengo unos productos que tienen su tabla de compras y otra de ventas.

    Si quisiera hacer un listado de productos comprados y vendidos entre fechas.

    Estaría correcto algo así??:

    declare @fecini as date= '01-01-2016'
    declare @fecfin as date= '30-01-2016'
    
    SELECT e.MODELO,e.COLOR, e.FECHA ,v.fecha
    FROM FMONTENT e  INNER JOIN FVENMONT v
    
    ON  e.modelo = v.modelo
    AND e.color=v.color
    
    WHERE e.fecha BETWEEN @fecini AND @fecfin
    
    AND v.fecha BETWEEN @fecini AND @fecfin
    
    GROUP BY e.modelo,e.color,e.fecha,v.FECHA
    Group by siempre tiene que ir con todo lo que hay en el Select ??
    No podría hacer un group by solo de Fecha ? o del modelo ?

    miércoles, 25 de enero de 2017 12:23

Respuestas

  • Las compras y ventas pueden ocurrir independientes y por lo tanto podrias tener productos vendidos sin que haya compra asociada y viceversa.

    En tu caso deberas hacer dos queries independientes y luego unirlos pero como comente antes, la union debera ser FULL OUTER JOIN para seleccionar compras sin ventas asociadas y ventas sin compras asociadas.

    with compras as (
    select E.modelo, sum(C.valor * C.cantidad) as valor_compra from... where... group by E.modelo, C.fecha
    )
    , ventas as (
    select E.modelo, sum(V.valor * V.cantidad) as valor_venta from... where... group by E.modelo, V.fecha
    )
    select
        coalesce(C.modelo, V.modelo) as modelo,
        coalesce(C.fecha, V.fecha) as fecha_transaccion,
        isnull(C.valor_compra) as valor_compra,
        isnull(V.valor_venta) as valor_venta
    from
        compras as C full outer join ventas as V
        on C.modelo = V.modelo
        and C.fecha = V.fecha; 

    En cuanto a tu pregunta sobre el GROUP BY, las columnas que no participen en la agrupacion (GROUP BY), entonces deberan ser referenciadas en alguna funcion de agregacion (MIN/MAX/etc.) si estas forman parte de la lista de columnas referenciadas en la clausula SELECT.

    Como indico Geovanny, es importante conocer el proceso logico de un query por parte del gestor y al igual que el recomiendo el libro de Itzik Ben-Gan sobre los funcdamentos del lenguaje T-SQL.

    https://www.amazon.com/T-SQL-Fundamentals-3rd-Itzik-Ben-Gan/dp/150930200X

    Proceso logico de un query:

    - FROM (operadores a nivel de tabla INNER / OUTER JOIN, APPLY, PIVOT/UNPIVOT)

    - WHERE

    - GROUP BY

    - HAVING

    - SELECT (evaluar expresiones, DISTINCT y TOP)

    - ORDER BY


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas




    miércoles, 25 de enero de 2017 13:56

Todas las respuestas

  • En este tipo de casos creo que lo mejor es que inviertas un tiempo revisando para mi un libro fundamental, T-SQL Fundamentals de Itzik Ben-Gan, eso te dara muchas respuestas y con una explicacion a profundidad.

    Lo que te puedo comentar al respecto es que en este caso la agrupacion lo que te establece es un criterio sobre el que operar dentro de un set de datos, tu puedes ampliarlo o limitarlo, pero solo podras mostrar en tu select las columnas que hayas incluido en el Group By u operaciones de agregación ( Count, Sum, etc).


    "Oh, the wind, the wind is blowing,through the graves the wind is blowing,Freedom soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net

    miércoles, 25 de enero de 2017 13:36
  • Las compras y ventas pueden ocurrir independientes y por lo tanto podrias tener productos vendidos sin que haya compra asociada y viceversa.

    En tu caso deberas hacer dos queries independientes y luego unirlos pero como comente antes, la union debera ser FULL OUTER JOIN para seleccionar compras sin ventas asociadas y ventas sin compras asociadas.

    with compras as (
    select E.modelo, sum(C.valor * C.cantidad) as valor_compra from... where... group by E.modelo, C.fecha
    )
    , ventas as (
    select E.modelo, sum(V.valor * V.cantidad) as valor_venta from... where... group by E.modelo, V.fecha
    )
    select
        coalesce(C.modelo, V.modelo) as modelo,
        coalesce(C.fecha, V.fecha) as fecha_transaccion,
        isnull(C.valor_compra) as valor_compra,
        isnull(V.valor_venta) as valor_venta
    from
        compras as C full outer join ventas as V
        on C.modelo = V.modelo
        and C.fecha = V.fecha; 

    En cuanto a tu pregunta sobre el GROUP BY, las columnas que no participen en la agrupacion (GROUP BY), entonces deberan ser referenciadas en alguna funcion de agregacion (MIN/MAX/etc.) si estas forman parte de la lista de columnas referenciadas en la clausula SELECT.

    Como indico Geovanny, es importante conocer el proceso logico de un query por parte del gestor y al igual que el recomiendo el libro de Itzik Ben-Gan sobre los funcdamentos del lenguaje T-SQL.

    https://www.amazon.com/T-SQL-Fundamentals-3rd-Itzik-Ben-Gan/dp/150930200X

    Proceso logico de un query:

    - FROM (operadores a nivel de tabla INNER / OUTER JOIN, APPLY, PIVOT/UNPIVOT)

    - WHERE

    - GROUP BY

    - HAVING

    - SELECT (evaluar expresiones, DISTINCT y TOP)

    - ORDER BY


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas




    miércoles, 25 de enero de 2017 13:56