Ver Mensaje Individual
  #4 (permalink)  
Antiguo 19/11/2012, 23:50
GeriReshef
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 12 años, 4 meses
Puntos: 40
Respuesta: [Duda] Subconsultas SQL

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 original
  1. WITH Total AS
  2. (SELECT SUM(Q.cantidad * P.precio) AS Total,
  3.         D.nombre AS Distri
  4. FROM    Distribuidora D
  5. INNER JOIN Venta V
  6.         ON D.distribuidora_id = V.distribuidora_id
  7. INNER JOIN Venta_Detalle Q
  8.         ON V.venta_id = Q.venta_id
  9. INNER JOIN Producto P
  10.         ON Q.produc_id = P.produc_id
  11. WHERE MONTH(V.fecha) IN ('01', '02', '03')
  12. GROUP BY D.nombre)
  13. SELECT  Totales.Distri AS 'Mejor cliente',
  14.         TMaximo.Maximo AS 'Suma de totales'
  15. FROM    (SELECT MAX(Totales.Total) AS Maximo
  16.         FROM    Total AS Totales) AS TMaximo,
  17.         Total AS Totales
  18. 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 original
  1. SELECT  Distri AS 'Mejor cliente',
  2.         Toatal AS 'Suma de totales'
  3. FROM    (SELECT SUM(Q.cantidad * P.precio) AS Total,
  4.                 D.nombre AS Distri,
  5.                 ROW_NUMBER() OVER(ORDER BY SUM(Q.cantidad * P.precio) DESC) Nm
  6.         FROM    Distribuidora D
  7.         INNER JOIN Venta V
  8.                 ON D.distribuidora_id = V.distribuidora_id
  9.         INNER JOIN Venta_Detalle Q
  10.                 ON V.venta_id = Q.venta_id
  11.         INNER JOIN Producto P
  12.                 ON Q.produc_id = P.produc_id
  13.         WHERE MONTH(V.fecha) IN ('01', '02', '03')
  14.         GROUP BY D.nombre) Total
  15. WHERE   Nm=1;
Último comentario- el Alias 'Suma de totales' debe ser 'Maximo de totales'.
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog