sql >> Base de Datos >  >> RDS >> Mysql

Consulta para encontrar el cliente con la mayor cantidad de compras totales

Creo que la siguiente consulta debería funcionar para identificar el nombre del cliente con la cantidad más alta derivado de todos los pedidos en el año calendario actual:

SELECT CUSTOMER_NAME, Y.QNTY 
FROM CUSTOMER_T CUST,
(
  SELECT X.CUSTOMER_ID, X.QNTY, MAX(X.QNTY) MAXAMT
  FROM (
        SELECT ORD.CUSTOMER_ID, SUM(OLN.QUANTITY * PRD.UNIT_PRICE) QNTY
        FROM ORDER_T ORD, ORDER_LINE_T OLN, PRODUCT_T PRD
        WHERE TRUNC(OLN.ORDER_DATE,'YEAR') = TRUNC(SYSDATE,'YEAR')
        AND ORD.ORDER_ID = OLN.ORDER_ID
        AND PRD.PRODUCT_ID = OLN.PRODUCT_ID
        GROUP BY ORD.CUSTOMER_ID
       ) X 
) Y
WHERE CUST.CUSTOMER_ID = Y.CUSTOMR_ID
AND Y.QNTY = Y.MAXAMT;

La consulta más interna une las tablas PEDIDO, LÍNEA_DE_PEDIDO y PRODUCTO agrupadas por ID de cliente para sumar el total de compras del año en curso (pedidos por cantidad sumada descendente). La consulta de nivel superior utiliza los resultados de la consulta interna y agrega el total máximo de compras. La consulta más externa se une a la tabla CUSTOMER_T con los resultados internos para obtener el Nombre del cliente y el monto total del pedido para todos los clientes que coincidan con el valor MAXAMT.

Puede modificar la condición de fecha para restringir siempre a 2016 (independientemente del año actual) de la siguiente manera:

WHERE TRUNC(OLN.ORDER_DATE,'YEAR') = TRUNC(SYSDATE,'YEAR')

Escribir como:

WHERE TRUNC(OLN.ORDER_DATE,'YEAR') = TRUNC(TO_DATE('01/01/2016','MM/DD/YYYY'),'YEAR')

También puede extraer la consulta externa de CUSTOMER_T dentro de la tabla interna y agregarla a las uniones. Logra lo mismo, pero no estoy seguro de cuál es más eficiente (que es aplicable si su conjunto de datos es grande).

Nota:Escrito desde una perspectiva de base de datos de Oracle, espero que esto ayude y pueda convertir la sintaxis.

Editar:me di cuenta de que mi sugerencia pasaría por alto a varios clientes con el mismo monto total de gasto. Lo modifiqué para usar MAX y mostrar varios clientes (si corresponde). Espero que esto funcione para usted/se pueda convertir a MYSQL.