Mysql
 sql >> база данни >  >> RDS >> Mysql

Заявка за намиране на клиента с най-голяма обща сума покупки

Вярвам, че следната заявка трябва да работи, за да идентифицира името на клиента с най-високата сума получени от всички поръчки през текущата календарна година:

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;

Най-вътрешната заявка се присъединява към таблиците ORDER, ORDER_LINE и PRODUCT, групирани по ИД на клиента, за да сумира общите покупки за текущата година (поръчки по сумирана сума в низходящ ред). Заявката нагоре с едно ниво използва резултатите от вътрешната заявка и добавя максималния сумиран общ брой покупки. Най-външната заявка се присъединява към таблицата CUSTOMER_T с вътрешните резултати, за да получи името на клиента и общата сума на поръчката за всички клиенти, които отговарят на стойността MAXAMT.

Можете да промените условието за дата винаги да се ограничава до 2016 (независимо от текущата година), както следва:

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

Напишете като:

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

Можете също така да изтеглите външната заявка на CUSTOMER_T във вътрешната таблица и да я добавите към съединенията. Постига същото, но не съм сигурен кое е по-ефективно (което е приложимо, ако вашият набор от данни е голям).

Забележка:Написано от гледна точка на Oracle DB, надяваме се това да помогне и можете да преобразувате синтаксиса.

Редактиране:Разбрах, че моето предложение ще пренебрегне множество клиенти с една и съща обща сума на разходите. Преработих го, за да използва MAX и да показва множество клиенти (ако е приложимо). Надяваме се, че това работи за вашия/може да се преобразува в MYSQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Мога ли да използвам множество изрази в JDBC подготвена заявка?

  2. не може да се свърже с mysql база данни в Ubuntu

  3. изчислете възрастта в години, месеци и дни

  4. Пространството, заето от изтрити редове, се използва ли повторно?

  5. Каква функция да използвате за хеширане на пароли в MySQL?