funciones ejemplos datos consultas agrupar agrupamiento agrupadas agregacion sql-server group-by aggregate

sql-server - ejemplos - having sql



SQL GROUP BY con columnas que contienen valores espejados (3)

Perdón por el título malo No podría pensar en una mejor manera de describir mi problema.

Tengo la siguiente tabla:

Category | A | B A | 1 | 2 A | 2 | 1 B | 3 | 4 B | 4 | 3

Me gustaría agrupar los datos por Category , devolver solo 1 línea por categoría, pero proporcionar ambos valores de las columnas A y B

Entonces el resultado debería verse así:

category | resultA | resultB A | 1 | 2 B | 4 | 3

¿Cómo se puede lograr esto?

Intenté esta declaración:

SELECT category, a, b FROM table GROUP BY category

pero, obviamente, obtengo los siguientes errores:

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

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

¿Cómo puedo lograr el resultado deseado?


Costuras que realmente no desea agregar por categoría, sino más bien eliminar filas duplicadas de su resultado (o más bien filas que considere duplicadas).

Consideras un par (x, y) igual al par (y, x). Para encontrar duplicados, puede poner el valor más bajo en primer lugar y el mayor en el segundo y luego aplicar DISTINCT en las filas:

select distinct category, case when a < b then a else b end as attr1, case when a < b then b else a end as attr2 from mytable;


Prueba esto:

SELECT category, MIN(a) AS resultA, MAX(a) AS resultB FROM table GROUP BY category

Si los valores se duplican, puede obtener ambos valores usando MIN , MAX aplicado en una sola columna como a .


Teniendo en cuenta que desea un registro aleatorio de duplicados para cada category .

Aquí hay un truco usando el constructor con valores de tabla y la función de ventana Row_Number

;with cte as ( SELECT *, (SELECT Min(min_val) FROM (VALUES (a),(b))tc(min_val)) min_val, (SELECT Max(max_val) FROM (VALUES (a),(b))tc(max_val)) max_val FROM (VALUES (''A'',1,2), (''A'',2,1), (''B'',3,4), (''B'',4,3)) tc(Category, A, B) ) select Category,A,B from ( Select Row_Number()Over(Partition by category,max_val,max_val order by (select NULL)) as Rn,* From cte ) A Where Rn = 1