SQL - Duda crear grupos con numero maximo de registros

   
Vista:

Duda crear grupos con numero maximo de registros

Publicado por Alvaro (3 intervenciones) el 04/09/2013 13:13:51
Buenas,

Buenos días a todos, espero que alguien me pueda ayudar con esta consulta.
Estoy intentando separar una consulta agrupada por un numero maximo de registros permitidos.
la consulta es la siguiente:

SELECT TOP (100) PERCENT MIN(dbo.DetallesMtos.id_manifiesto) AS Min_manifiesto, dbo.Pedidos.prov_pedido, dbo.Pedidos.imp_pedido,
dbo.Pedidos.tdecl_pedido, dbo.Pedidos.pproced_pedido, dbo.Pedidos.vendedor_pedido, dbo.Pedidos.divisa_pedido,
dbo.DetallesPedidos.NumCambio_detalle, dbo.DetallesPedidos.incoterm_detalle, dbo.DetallesPedidos.natt_detalle, 'Pendiente' AS P,
dbo.Manifiestos.LMercD_mto, COUNT (dbo.DetallesMtos.id_Partida) as NumRegistros
FROM dbo.Pedidos RIGHT OUTER JOIN
dbo.DetallesPedidos ON dbo.Pedidos.id_Pedido = dbo.DetallesPedidos.id_Pedido RIGHT OUTER JOIN
dbo.DetallesMtos ON dbo.DetallesPedidos.id_Pedido = dbo.DetallesMtos.id_pedidoMto AND
dbo.DetallesPedidos.id_Detalle = dbo.DetallesMtos.id_DetalleMto LEFT OUTER JOIN
dbo.Manifiestos ON dbo.DetallesMtos.id_manifiesto = dbo.Manifiestos.id_Mto
WHERE (dbo.DetallesMtos.estadoMto = 'I5')
GROUP BY dbo.Pedidos.prov_pedido, dbo.Pedidos.imp_pedido, dbo.Pedidos.tdecl_pedido, dbo.Pedidos.pproced_pedido, dbo.Pedidos.divisa_pedido,
dbo.DetallesPedidos.NumCambio_detalle, dbo.DetallesPedidos.incoterm_detalle, dbo.DetallesPedidos.natt_detalle, dbo.Manifiestos.LMercD_mto,
dbo.Pedidos.vendedor_pedido, dbo.Pedidos.prov_pedido
ORDER BY Min_manifiesto

Como pueden ver la ultima columna es la cuenta del total de detalles de cada grupo.
Aca un pantallazo del resultado


El problema es que no deberia tener grupos con mas de 5 registros, por lo que quiero que me los separe. Es decir un grupo de 5 otro de 4 y el ultimo igual que esta
El resultado seria el que ven la imagen


Gracias por vuestra ayuda
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Duda crear grupos con numero maximo de registros

Publicado por leonardo_josue (878 intervenciones) el 04/09/2013 17:10:28
Hola Alvaro:

Olvidaste mencionar con qué manejador de BD estás trabajando, puedo suponer que se trata de SQL Server, pero eso tendrías que aclararlo tú. Tampoco nos das una explicación de tu modelo, y supongo que te das cuenta de que tu consulta no es tan simple como para poder entenderla a primera vista, ojo con eso, entre más detalles des de tu modelo y de tus datos, más factible será que que te podamos ayudar... sin embargo creo entender el problema, para el ejemplo voy hacerlo con MySQL y voy a considerar la siguiente tabla:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> SELECT grupo, total FROM tabla;
+---------+-------+
| grupo   | total |
+---------+-------+
| grupo 1 |    10 |
| grupo 1 |    11 |
| grupo 1 |    12 |
| grupo 1 |    13 |
| grupo 1 |    14 |
| grupo 1 |    15 |
| grupo 1 |    16 |
| grupo 1 |    17 |
| grupo 1 |    18 |
| grupo 2 |    19 |
| grupo 2 |    20 |
| grupo 2 |    21 |
| grupo 2 |    22 |
| grupo 2 |    23 |
| grupo 2 |    24 |
+---------+-------+
15 rows in set (0.00 sec)

Si haces una agrupación por el campo GRUPO obtienes lo siguiente:

1
2
3
4
5
6
7
8
9
mysql> SELECT grupo, COUNT(*) total_elementos, SUM(total) total_suma
    -> FROM tabla GROUP BY grupo;
+---------+-----------------+------------+
| grupo   | total_elementos | total_suma |
+---------+-----------------+------------+
| grupo 1 |               9 |        126 |
| grupo 2 |               6 |        129 |
+---------+-----------------+------------+
2 rows in set (0.00 sec)


pero si entiendo correctamente lo que tú quieres es que no existan grupos de más de 5 elementos, por lo tanto el GRUPO 1 se debe dividir en dos (uno de 5 y otro de 4) y el GRUPO 2 se dividiría a su vez en dos grupos (uno de 5 y otro de 1). Hay varias formas para hacer esto, la que pienso que es más simple es NUMERAR los registros por grupo, de tal manera que obtengas una tabla así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> SELECT id, grupo, total FROM tabla;
+------+---------+-------+
| id   | grupo   | total |
+------+---------+-------+
|    1 | grupo 1 |    10 |
|    2 | grupo 1 |    11 |
|    3 | grupo 1 |    12 |
|    4 | grupo 1 |    13 |
|    5 | grupo 1 |    14 |
|    6 | grupo 1 |    15 |
|    7 | grupo 1 |    16 |
|    8 | grupo 1 |    17 |
|    9 | grupo 1 |    18 |
|    1 | grupo 2 |    19 |
|    2 | grupo 2 |    20 |
|    3 | grupo 2 |    21 |
|    4 | grupo 2 |    22 |
|    5 | grupo 2 |    23 |
|    6 | grupo 2 |    24 |
+------+---------+-------+
15 rows in set (0.00 sec)


Con SQL Server podrías utilizar ROW_NUMBER y PARTITION. Con esta columna, lo que puedes hacer es obtener LA DIVISIÓN ENTERA DEL ID entre 5, (DIV), es decir, algo como esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> SELECT id, (id - 1) DIV 5, grupo, total FROM tabla;
+------+----------------+---------+-------+
| id   | (id - 1) DIV 5 | grupo   | total |
+------+----------------+---------+-------+
|    1 |              0 | grupo 1 |    10 |
|    2 |              0 | grupo 1 |    11 |
|    3 |              0 | grupo 1 |    12 |
|    4 |              0 | grupo 1 |    13 |
|    5 |              0 | grupo 1 |    14 |
|    6 |              1 | grupo 1 |    15 |
|    7 |              1 | grupo 1 |    16 |
|    8 |              1 | grupo 1 |    17 |
|    9 |              1 | grupo 1 |    18 |
|    1 |              0 | grupo 2 |    19 |
|    2 |              0 | grupo 2 |    20 |
|    3 |              0 | grupo 2 |    21 |
|    4 |              0 | grupo 2 |    22 |
|    5 |              0 | grupo 2 |    23 |
|    6 |              1 | grupo 2 |    24 |
+------+----------------+---------+-------+
15 rows in set (0.00 sec)


OJO, el id-1 es sólo para que comience a dividir desde el CERO... de esta manera ya tienes grupos de 5 elementos, lo único que tienes que hacer es agrupar por este campo y tu campo GRUPO...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SELECT
    ->    (id - 1) DIV 5,
    ->    grupo,
    ->    COUNT(*) total_elementos,
    ->    SUM(total) total_suma
    -> FROM tabla GROUP BY (id - 1) DIV 5, grupo
    -> ORDER BY 2, 1;
+----------------+---------+-----------------+------------+
| (id - 1) DIV 5 | grupo   | total_elementos | total_suma |
+----------------+---------+-----------------+------------+
|              0 | grupo 1 |               5 |         60 |
|              1 | grupo 1 |               4 |         66 |
|              0 | grupo 2 |               5 |        105 |
|              1 | grupo 2 |               1 |         24 |
+----------------+---------+-----------------+------------+
4 rows in set (0.00 sec)


Dale un vistazo para ver si esto te puede servir en tu consulta. espero que no tengas problemas para hacer la implementación en la BD que estés utilizando.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda crear grupos con numero maximo de registros

Publicado por Alvaro (3 intervenciones) el 05/09/2013 13:09:39
Hola Leo,

Efectivamente deberia haberos facilitado algun dato mas.
Es la primera vez que escribo en un foro y me falta practica :)

La consulta la estoy haciendo en un sql server 2008
Creo que tu solucion se adapta a lo que necesito, voy a probarlo y te cuento.

Gracias crack
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar