es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La consulta SQL GROUP BY agrupa

Tengo algo así:

id nombre totalAmount
1 nombre1 10
2 nombre1 20
3 nombre1 25
4 nombre2 5
5 nombre2 12

Y necesito que se vea así:

id’s nombre totalAmount
1,2 nombre1 30
2,3 nombre1 45
1,3 nombre1 35
1,2,3 nombre1 55
4,5 nombre2 17

Estoy utilizando STRING_AGG pero no sé cómo separar los primeros 3 ids.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, puede utilizar la función ROW_NUMBER() para numerar las filas dentro de cada grupo de nombres. Luego, puede usar STRING_AGG() con una instrucción CASE para concatenar los valores de id basados en el número de fila.

    Aquí hay un ejemplo de consulta:

    SELECT 
        STRING_AGG(CASE WHEN rn <= 3 THEN id END, ',') WITHIN GROUP (ORDER BY id) AS [id's],
        name,
        SUM(totalAmount) AS totalAmount
    FROM (
        SELECT 
            id,
            name,
            totalAmount,
            ROW_NUMBER() OVER (PARTITION BY name ORDER BY totalAmount DESC, id ASC) AS rn
        FROM your_table
    ) sub
    GROUP BY name, rn
    ORDER BY name, rn
    

    En esta consulta, la consulta interna SELECT utiliza ROW_NUMBER() para numerar las filas dentro de cada grupo de nombres. Las filas se ordenan por totalAmount en orden descendente y luego por id en orden ascendente.

    La consulta externa SELECT utiliza entonces STRING_AGG() con una instrucción CASE para concatenar los valores de id basados en el número de fila (rn). Si el número de fila es menor o igual a 3, el valor de id se incluye en la concatenación. De lo contrario, se excluye.

    El resultado se agrupa por name y rn, y los valores de totalAmount se suman para cada grupo. El resultado se ordena por name y rn.

    Esto debería darle el resultado deseado con los primeros 3 valores de id separados por comas.

Comments are closed.