Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

[Duda] Subconsultas SQL

Estas en el tema de [Duda] Subconsultas SQL en el foro de SQL Server en Foros del Web. BD_Gaseosas 1. Mostrar al mejor cliente(distribuidora) de todos los años en solo los meses de verano (considerar mejor cliente al que acumulo mejor suma de ...
  #1 (permalink)  
Antiguo 19/11/2012, 14:00
 
Fecha de Ingreso: septiembre-2012
Ubicación: Lima, Perú.
Mensajes: 20
Antigüedad: 11 años, 7 meses
Puntos: 0
Pregunta [Duda] Subconsultas SQL

BD_Gaseosas
1. Mostrar al mejor cliente(distribuidora) de todos los años en solo los meses de verano
(considerar mejor cliente al que acumulo mejor suma de totales por facturas compradas)

Para sacar el máximo suma total se puede intentar con visores o ordenar la lista según totales y mostrar sólo el primero con select top 1. Pero el profe me dice que lo haga en subconsultas, sólo pude hacer lo siguiente:

Código SQL:
Ver original
  1. SELECT D.nombre AS Distri, (Q.cantidad * P.precio) AS Total
  2. FROM Distribuidora D INNER JOIN (Venta V INNER JOIN (Venta_Detalle Q INNER JOIN Producto P ON Q.produc_id = P.produc_id)
  3. ON V.venta_id = Q.venta_id) ON D.distribuidora_id = V.distribuidora_id
  4. WHERE MONTH(V.fecha) IN ('01', '02', '03') AND
  5. (Q.cantidad * P.precio) =
  6. (
  7. SELECT MAX(Q.cantidad * P.precio)
  8. FROM Distribuidora D INNER JOIN (Venta V INNER JOIN (Venta_Detalle Q INNER JOIN Producto P ON Q.produc_id = P.produc_id)
  9. ON V.venta_id = Q.venta_id) ON D.distribuidora_id = V.distribuidora_id
  10. WHERE MONTH(V.fecha) IN ('01', '02', '03')
  11. )
Que saca el total de cada factura, pero cuando intento darle suma a la operación de total, no puedo sacar el máximo ya que en Select no se puede hacer subconsulta como Max(SUM(Q.cantidad * P.precio));

Espero que me ayuden a mostrar una lista que saque el máximo de las sumas totales

Salu2!
  #2 (permalink)  
Antiguo 19/11/2012, 14:34
 
Fecha de Ingreso: septiembre-2012
Ubicación: Lima, Perú.
Mensajes: 20
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: [Duda] Subconsultas SQL

Podrían moverlo a la sección de Select?
  #3 (permalink)  
Antiguo 19/11/2012, 15:56
 
Fecha de Ingreso: septiembre-2012
Ubicación: Lima, Perú.
Mensajes: 20
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: [Duda] Subconsultas SQL

La lista de sumas totales de cada cliente(Distribuidoras):
Código SQL:
Ver original
  1. SELECT SUM(Q.cantidad * P.precio) AS Total, D.nombre AS Distri
  2. FROM Distribuidora D INNER JOIN (Venta V INNER JOIN (Venta_Detalle Q INNER JOIN
  3. Producto P ON Q.produc_id = P.produc_id)
  4. ON V.venta_id = Q.venta_id) ON D.distribuidora_id = V.distribuidora_id
  5. WHERE MONTH(V.fecha) IN ('01', '02', '03')
  6. GROUP BY D.nombre

El comando que saca su valor máximo:
Código SQL:
Ver original
  1. SELECT MAX(Totales.Total) AS Maximo
  2. FROM (SELECT SUM(Q.cantidad * P.precio) AS Total, D.nombre AS Distri
  3. FROM Distribuidora D INNER JOIN (Venta V INNER JOIN (Venta_Detalle Q INNER JOIN
  4. Producto P ON Q.produc_id = P.produc_id)
  5. ON V.venta_id = Q.venta_id) ON D.distribuidora_id = V.distribuidora_id
  6. WHERE MONTH(V.fecha) IN ('01', '02', '03')
  7. GROUP BY D.nombre) AS Totales

y si lo unimos para sacar su valor máximo y el nombre de su distribuidora, lo hice así:
Código SQL:
Ver original
  1. SELECT Totales.Distri AS 'Mejor cliente',TMaximo.Maximo AS 'Suma de totales'
  2. FROM (SELECT MAX(Totales.Total) AS Maximo
  3. FROM (SELECT SUM(Q.cantidad * P.precio) AS Total, D.nombre AS Distri
  4. FROM Distribuidora D INNER JOIN (Venta V INNER JOIN (Venta_Detalle Q INNER JOIN
  5. Producto P ON Q.produc_id = P.produc_id)
  6. ON V.venta_id = Q.venta_id) ON D.distribuidora_id = V.distribuidora_id
  7. WHERE MONTH(V.fecha) IN ('01', '02', '03')
  8. GROUP BY D.nombre) AS Totales) AS TMaximo,
  9. (SELECT SUM(Q.cantidad * P.precio) AS Total, D.nombre AS Distri
  10. FROM Distribuidora D INNER JOIN (Venta V INNER JOIN (Venta_Detalle Q INNER JOIN
  11. Producto P ON Q.produc_id = P.produc_id)
  12. ON V.venta_id = Q.venta_id) ON D.distribuidora_id = V.distribuidora_id
  13. WHERE MONTH(V.fecha) IN ('01', '02', '03')
  14. GROUP BY D.nombre) AS Totales
  15. WHERE Totales.Total = TMaximo.Maximo

Y me funcionó!

Aunque parece largo, quisiera saber si tienen otra idea para simplificar el último comando. Salu2!

Última edición por Garhard; 19/11/2012 a las 15:58 Razón: para resaltar en negrita y poner su cuadro en SQL.
  #4 (permalink)  
Antiguo 19/11/2012, 23:50
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 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
  #5 (permalink)  
Antiguo 20/11/2012, 00:05
 
Fecha de Ingreso: septiembre-2012
Ubicación: Lima, Perú.
Mensajes: 20
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: [Duda] Subconsultas SQL

Sí, mi profesor no enseña todavía el with, gracias por el tips GeriReshef!

Un saludo.

Etiquetas: select, sql, subconsultas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:11.