Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Consulta para encontrar o cliente com maior quantidade de compras totais


Acredito que a consulta a seguir deve funcionar para identificar o nome do cliente com o maior valor derivados de todos os pedidos no ano civil atual:
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;

A consulta mais interna une as tabelas ORDER, ORDER_LINE e PRODUCT agrupadas pelo ID do cliente para somar o total de compras do ano atual (pedidos por valor somado decrescente). A consulta um nível acima usa os resultados da consulta interna e adiciona o total máximo somado de compras. A consulta mais externa une a tabela CUSTOMER_T com os resultados internos para obter o nome do cliente e o valor total do pedido para todos os clientes que correspondem ao valor MAXAMT.

Você pode modificar a condição de data para sempre restringir a 2016 (independentemente do ano atual) da seguinte forma:
WHERE TRUNC(OLN.ORDER_DATE,'YEAR') = TRUNC(SYSDATE,'YEAR')

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

Você também pode puxar a consulta externa de CUSTOMER_T dentro da tabela interna e adicioná-la às junções. Ele realiza a mesma coisa, mas não tenho certeza de qual é mais eficiente (o que é aplicável se seu conjunto de dados for grande).

Nota:Escrito a partir de uma perspectiva de banco de dados Oracle, espero que isso ajude e você possa converter a sintaxe.

Edit:percebi que minha sugestão ignoraria vários clientes com o mesmo valor total de gastos. Eu o reformulei para usar o MAX e mostrar vários clientes (se aplicável). Espero que isso funcione para o seu / pode ser convertido para MYSQL.