Obtener 5 registros a partir de una fila

Espero que los expertos me ayuden con esta consulta.

Tengo la siguiente tabla ordenada por empleado

Necesito hacer 2 consultas:

1. Extraer 5 filas a partir de la fila 6, en este caso a partir del idempleado =18, es decir lo resaltado

2. De estos registros extraídos necesito obtener el sueldo más alto, es decir, 630000.

Nuevamente me sirve la respuesta en Excel, Access o PostgreSQL

Una vez más, mil gracias a los expertos Eduardo, Julián y Dante que respondieron mi pregunta anterior.

2 respuestas

Respuesta
1

1. Solución en ACCESS

Pensando que el rango debe ser variable, le preparé la siguiente función

FUNCIÓN EXTRAE_DATOS()

Public Function extrae_datos(filainicial As Long, cantidad As Long)
'Función para extraer registros a partir de una fila hasta otra
 'y obtener entres éstas el sueldo mayor
 'Elaborado Por:
 '              EDUARDO PÉREZ FERNÁNDEZ
 'Fecha        :18/02/2023
 On Error GoTo hay_error
  Dim strSQl As String
  Dim intExtrae As Integer
  Dim smaximo As Double
  intExtrae = filainicial + cantidad - 1
  'Requiere de la función: consecutivo()
  'Verifico si existe la tabla
    If DCount("[Name]", "MSysObjects", "[Name] = 'temgrupos'") = 1 Then
        DoCmd.DeleteObject acTable, "temgrupos"
    End If
   'Verifico si existe la consulta
    If DCount("[Name]", "MSysObjects", "[Name] = 'qryExtraeReg'") = 1 Then
        DoCmd.DeleteObject acQuery, "qryExtraeReg"
    End If
  strSQl = "SELECT tblempleados.idempleado" & vbCrLf
  strSQl = strSQl & "           , tblempleados.empleado" & vbCrLf
  strSQl = strSQl & "           , tblempleados.sueldo" & vbCrLf
  strSQl = strSQl & "           , consecutivo([idempleado]) AS cons INTO temgrupos" & vbCrLf
  strSQl = strSQl & "        FROM tblempleados" & vbCrLf
  strSQl = strSQl & "    ORDER BY tblempleados.empleado;"
  CurrentDb.Execute strSQl
  strSQl = "SELECT temgrupos.idempleado" & vbCrLf
  strSQl = strSQl & "           , temgrupos.empleado" & vbCrLf
  strSQl = strSQl & "           , temgrupos.sueldo" & vbCrLf
  strSQl = strSQl & "        FROM temgrupos" & vbCrLf
  strSQl = strSQl & "       WHERE temgrupos.cons Between " & filainicial & " AND " & intExtrae & ";"
 Dim db As DAO.Database
 Dim qdf As DAO.QueryDef
Set db = CurrentDb()
Set qdf = db.CreateQueryDef("qryExtraeReg", strSQl)
' Abre la consulta y muéstrala
DoCmd.OpenQuery qdf.Name, acViewNormal
' Libera la memoria
Set qdf = Nothing
Set db = Nothing
If Err.Number = 0 Then
   MsgBox "Consulta creada satisfactoriamente", vbInformation, "Le informo"
   smaximo = DMax("sueldo", "qryExtraeReg")
   MsgBox "El sueldo mayor es " & Format(smaximo, "Currency"), vbInformation, "Sueldo mayor"
   DoCmd.Close acQuery, "qryExtraeReg"
End If
hay_error_Exit:
  Exit Function
hay_error:
    MsgBox "Ocurrió el error " & Err.Number & vbCrLf & Err.Description, vbCritical, "Error..."
    Resume hay_error_Exit
End Function

Utilizo la siguiente función para numerar las filas de la consulta

CÓDIGO FUNCIÓN CONSECUTIVO()

Public Function consecutivo(nDato) As Long
 'Numera los registros de una consulta
 Static nCONTADOR As Long
 Static mcuenta As Integer
     If IsNull(nDato) Then 'si nDato es nulo: Iniciamos valor
         nCONTADOR = 0
         Exit Function
     End If
         nCONTADOR = nCONTADOR + 1
     consecutivo = nCONTADOR
     mcuenta = mcuenta + 1
     ' Si están todos los registros reinicio las varaibles estaticas
      If mcuenta >= DCount("*", "tblempleados") Then
          nCONTADOR = 0
          mcuenta = 0
      End If
End Function

Puede llamar la función desde cualquier parte. Ejemplo ventana de inmediato

?extrae_datos(6,5)

Resultado

2. Solución en POSTGRESQL

Se puede hacer con 2 consultas.

Consulta selección de las filas

-- Selecciona los 5 registros que comienzan en la fila número 6 
 SELECT
            Idempleado,
            Empleado,
            Sueldo
FROM
    (
        SELECT
            Idempleado,
            Empleado,
            Sueldo,
            ROW_NUMBER () OVER (ORDER BY empleado)
        FROM
            Tblempleados
 ) x
WHERE
    ROW_NUMBER BETWEEN 6 AND 10;

Resultado:

Consulta para obtener el sueldo mayor de las filas elegidas

-- Selecciona los 5 registros que comienzan en la fila número 6 y obtiene el sueldo mayor de estos
SELECT  MAX(sueldo) AS mas_alto FROM(SELECT
            Idempleado,
            Empleado,
            Sueldo
FROM
    (
        SELECT
            Idempleado,
            Empleado,
            Sueldo,
            ROW_NUMBER () OVER (ORDER BY empleado)
        FROM
            Tblempleados
 ) x
WHERE
    ROW_NUMBER BETWEEN 6 AND 10 ) AS elmayor;

Resultado:

En PostgreSQL si quiere pasar el rango de filas como parámetro puede crear 2 procedimientos almacenados, uno para las filas extraídas y otro para obtener el sueldo mayor.

Martha con lo expuesto demuestra una de las grandes ventajas de utilizar PostgreSQL con Access, toda vez que facilita la elaboración que en Access son complicadas.

Exactamente es lo que necesito estaba esperando tu respuesta, sabía que presentabas una solución, como siempre. Estoy de acuerdo como tú dices, " ventajas de utilizar PostgrSQL con Access", se ve en esta clase de consultas, nada que ver Excel y Access, aunque tienen sus bondades.

Aunque tu función de Access es maravillosa porque no se limita a un rango sino, que se puede seleccionar a partir de que fila y cuántas a partir de ésta, pero solo sirve para tablas vinculadas, en caso contrario me toca utilizar los scripts SQL.

Gracias, Eduardo 

Martha hay un script para PostgreSQ, más simple.

1. Obtener las filas

SELECT MAX(sueldo) AS mas_alto FROM(SELECT idempleado,empleado,sueldo
FROM tblempleados
ORDER BY empleado
OFFSET 6 - 1
LIMIT 5) AS elmayor;

2. Obtener el sueldo más alto

SELECT MAX(sueldo) AS mas_alto FROM(SELECT idempleado,empleado,sueldo
FROM tblempleados
ORDER BY empleado
OFFSET 6 - 1
LIMIT 5) AS elmayor;

Me cuenta si le sirve.

Respuesta
1

Visita:

Cursos de Excel y Macros

Por Dante Amor

----- --

En excel:

=K.ESIMO.MAYOR(DESREF(C1,6,0,5),1)

Cambia las comas ( , ) por punto y coma ( ; ) si lo utilizas como separador de argumentos.

Sería conveniente que en tus imágenes se vean las filas y las columnas de excel, para saber en dónde están tus datos. Por ejemplo:

----- --

Recomendación:

Curso de Excel. Funciones Contar y Sumar. - YouTube

¡Gracias! Dante, pero es parte de la solución ¿Cuál es el código para extraer los registros?. La hoja es como la indicas.

" La hoja es como la indicas", sí, pero sería de gran ayuda si nos ayudas con esa parte y así no tengo que estar adivinando dónde tienes tus datos.

Pon esta fórmula en la celda E2 y la copias hacia la derecha hasta G2, luego las copias hacia abajo hasta E6:

=INDICE(A$2:A$15,FILAS($A$1:A2)+4)

En la celda I2 pon esta fórmula:

=MAX(G2:G6)

Quedaría así:

----- --

Visita:

Cursos de Excel y Macros

Por Dante Amor

----- --

¡Gracias!  Dante por su tiempo, pero es una solución muy manual., no obstante, la tendré en cuenta más adelante.

Te paso una macro. La pones en un botón, presionas un clic en el botón y obtienes los resultados.

Los resultado quedarán en el las celdas de la imagen que te puse.

Sub cinco_registros()
  With Range("E2").Resize(5, 3)
    .Formula = "=INDEX(A$2:A$15,ROWS($A$1:A2)+4)"
    .Value = .Value
  End With
  Range("I2").Value = WorksheetFunction.Max(Range("G2:G6"))
End Sub

Sal u dos Dante Amor

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas