Supongo qe el profe es el Alias del profesor. Tengo razón?
Si es obligatorio usar sub consultas, escribiría tu consulta un poquito diferente:
Código SQL:
Ver originalWITH Total AS
(SELECT SUM(Q.cantidad * P.precio) AS Total,
D.nombre AS Distri
FROM Distribuidora D
INNER JOIN Venta V
ON D.distribuidora_id = V.distribuidora_id
INNER JOIN Venta_Detalle Q
ON V.venta_id = Q.venta_id
INNER JOIN Producto P
ON Q.produc_id = P.produc_id
WHERE MONTH(V.fecha) IN ('01', '02', '03')
GROUP BY D.nombre)
SELECT Totales.Distri AS 'Mejor cliente',
TMaximo.Maximo AS 'Suma de totales'
FROM (SELECT MAX(Totales.Total) AS Maximo
FROM Total AS Totales) AS TMaximo,
Total AS Totales
WHERE Totales.Total = TMaximo.Maximo;
Mis cambios no influirán el rendimiento, pero la consulta será mas comprensible.
1. Con el CTE (desde el With hasta el segundo Select) evitas escribiendo dos veces la misma sub consulta.
2. Yo prefiero poner cada clausula On despues de su Join, y no todas juntas.
Sin embargo, en lugar de repetir dos veces las mismas recuperaciones (de la sub consulta), yo utilizaría el Row_Number para enumerar las filas y filtrar la primera, y todo esto en una sola recuperación:
Código SQL:
Ver originalSELECT Distri AS 'Mejor cliente',
Toatal AS 'Suma de totales'
FROM (SELECT SUM(Q.cantidad * P.precio) AS Total,
D.nombre AS Distri,
ROW_NUMBER() OVER(ORDER BY SUM(Q.cantidad * P.precio) DESC) Nm
FROM Distribuidora D
INNER JOIN Venta V
ON D.distribuidora_id = V.distribuidora_id
INNER JOIN Venta_Detalle Q
ON V.venta_id = Q.venta_id
INNER JOIN Producto P
ON Q.produc_id = P.produc_id
WHERE MONTH(V.fecha) IN ('01', '02', '03')
GROUP BY D.nombre) Total
WHERE Nm=1;
Último comentario- el Alias 'Suma de totales' debe ser 'Maximo de totales'.