Uso de la sentencia MAX() en funciones definidas por el usuario SQL Server

CarlosGPT Seguir

Curioso
Verificación en dos pasos desactivada
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
16 May 2022
Mensajes
5
Buenas tardes estimados, el ejercicio que he realizado me pide lo siguiente:

Utilizando la función MAX() crear una función que muestre el registro del empleado que haya sacado más dinero por sus órdenes de venta.

Para hacer este ejercicio voy a utilizar otra función que he realizado previamente llamada "costoTotal", esta funcón me da como salida el costo total de una orden de venta con solo recibir el ID de la orden:

ALTER FUNCTION [dbo].[costoTotal](@ordenID int)



RETURNS table



RETURN (SELECT [Order Details].OrderID,



ROUND(SUM((UnitPrice -(UnitPrice*Discount)) * Quantity), 2)



AS Total_Orden FROM [Order Details]



WHERE OrderID = @ordenID

GROUP BY OrderID)



si la ejecuto:

select * from dbo.costoTotal(10250)



me da la siguiente salida:

OrderID Total_Orden

10250 1552.60



Ahora, utilizando esta función he creado la función que se me pide:



ALTER FUNCTION dbo.Maxima_Ventas()

RETURNS @table_resultado table (IdEmpleado int, Primer_Nombre nvarchar(10), Monto_total money)

AS

BEGIN

DECLARE @max_monto money;



SELECT @max_monto=MAX(res.Monto_total)

FROM(



SELECT SUM(c.Total_Orden) Monto_total

FROM Orders o

CROSS APPLY dbo.costoTotal(o_OrderID) c

GROUP BY o.EmployeeID

) res



INSERT INTO @table_resultado

SELECT o.EmployeeID, e.FirstName, @max_monto

FROM Orders o

JOIN Employees e ON o.EmployeeID = e.EmployeeID

GROUP BY o.EmployeeID, e.FirstName



RETURN

END



Pero al ejecutarla:

SELECT * FROM dbo.Maxima_Ventas



Obtengo el resultado correcto en la columna "Monto_total"

Pero me salen los registros de todos los empleados y sus ID:



idEmpleado Primer_Nombre Monto_Total

1 Andrew 232890.84

2 Janeth 232890.84

3 Margaret 232890.84

4 Steven 232890.84

5 Michael 232890.84

6 etc... etc...

7

8

9



Pero la respuesta que yo busco es la siguiente, correspondiente al empleado Margareth:

idEmpleado Primer_Nombre Monto_Total

3 Margaret 232890.84
 

Alfredo Ramos

Beta
Verificación en dos pasos activada
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
5 Abr 2022
Mensajes
79
Usa el BBCode para código, tu mensaje es extremadamente difícil de leer.

Screenshot_20220516_190334.png


No sé como tendrás tus tablas, pero si con el OrderID puedes obtener los datos del empleado, no necesitarías hacer la siguiente consulta, que dicho sea de paso y sin tener experiencia en SQL Server específicamente, de lejos se ve que esta mal planteada.

SQL:
SELECT o.EmployeeID, e.FirstName, @max_monto
FROM Orders o
JOIN Employees e ON o.EmployeeID = e.EmployeeID
GROUP BY o.EmployeeID, e.FirstName

Con esa sentencia estas obteniendo los datos de los empleados sin importar los datos de la orden.

Si compartieras la estructura de tu base de datos o al menos el diagrama ER, se te podría ayudar mejor.
 

CarlosGPT

Curioso
Verificación en dos pasos desactivada
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
16 May 2022
Mensajes
5
Gracias amigo por la observacion, soy novato pero con ganas de aprender, en cuanto pueda enviaré la informacion adicional para ser más específico.
 

moiseseccam

Pi
Verificado
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Desde
5 Mar 2013
Mensajes
6.342
Me parece o te dejaron eso de tarea
 

CarlosGPT

Curioso
Verificación en dos pasos desactivada
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
16 May 2022
Mensajes
5
Estoy recibiendo un curso online y al final de la leccion nos plantean unos problemas, este es uno de ellos. Lo he logrado resolver pero con la sentencia SUM(), y debe ser con la sentencia MAX().
 

CarlosGPT

Curioso
Verificación en dos pasos desactivada
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
16 May 2022
Mensajes
5
Aquí comparto el diagrama E_R con las tablas más importantes.
 

Adjuntos

  • Diagrama_E_R.pdf
    160,6 KB · Visitas: 10

Alfredo Ramos

Beta
Verificación en dos pasos activada
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
5 Abr 2022
Mensajes
79
Estoy recibiendo un curso online y al final de la leccion nos plantean unos problemas, este es uno de ellos. Lo he logrado resolver pero con la sentencia SUM(), y debe ser con la sentencia MAX().
Pero SUM() hace otra cosa, así que realmente no lo estas resolviendo.

Repito, no tengo experiencia con SQL Server, solo puedo inferir lo que comparto, no tengo forma de probarlo y es posible que sea incorrecto.

En tu función costoTotal en lugar de calcular el máximo como lo tienes con SUM(), podrías intentar con lo siguiente:

SQL:
MAX(ROUND(((UnitPrice - (UnitPrice * Discount)) * Quantity), 2))

Luego usa el OrderID que devuelves de la función costoTotal().

Algo como:

SQL:
SELECT e.EmployeeID, e.FirstName, ct.Total_Orden
FROM Employees AS e
INNER JOIN Orders AS o
    ON e.EmployeeID = o.EmployeeID
INNER JOIN costoTotal(10250) AS ct
    ON o.OrderID = ct.OrderID;

Prueba la sentencia por si sola antes de colocarla en tu función, para remplazar ese 10250 hard-codeado por un parámetro.

Repasa sobre funciones que devuelven tipos de datos como tablas, para acceder sus columnas.
 

CarlosGPT

Curioso
Verificación en dos pasos desactivada
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
16 May 2022
Mensajes
5
Ok,lo probaré y voy a repasar mas sobre la devolución de tablas, gracias por la ayuda.
Saludos
 

¡Regístrate y comienza a ganar!

Beneficios

  • Gana dinero por participar
  • Gana dinero por recomendarnos
  • Descubre ofertas de empleo diariamente
  • Negocios seguros
  • ¡Información premium y más!

Acceder

¿Ya tienes una cuenta? Accede aquí

Arriba