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

MySQL заявка за изчисляване на последните средни цени, като се използват данни от множество таблици

Опция би била заявка, която работи с потребителски променливи за генериране на класиране въз основа на дата. И изберете само трите последни дати.

Заявка

SELECT 
 *
FROM (
   SELECT 
   * 
   , CASE 
       WHEN @supplier = supplier
       THEN @rank := @rank + 1 
       ELSE @rank := 1
     END 
      AS rank
   , @supplier := supplier 
   FROM 
     Expenses 
   CROSS JOIN (
    SELECT
       @supplier := NULL
     , @rank := 0
    ) 
    AS
      init_user_params  
   WHERE
      product_id = 1       
   ORDER BY
      supplier ASC 
    , DATE DESC   
)
 AS Expenses_ranked 
WHERE
  Expenses_ranked.rank <= 3

Резултат

    id  product_id  cost    quantity  supplier  date        @supplier := NULL  @rank := 0    rank  @supplier := supplier  
------  ----------  ------  --------  --------  ----------  -----------------  ----------  ------  -----------------------
     4           1  3.98           2         1  2017-09-22  (NULL)                      0       1                        1
     3           1  2.50           1         1  2017-09-20  (NULL)                      0       2                        1
     1           1  2.99           1         1  2017-09-05  (NULL)                      0       3                        1
     6           1  8.00           2         2  2017-09-27  (NULL)                      0       1                        2
     5           1  4.00           1         2  2017-09-25  (NULL)                      0       2                        2
     2           1  3.00           2         2  2017-09-10  (NULL)                      0       3                        2

Използване на този резултат за генериране на среден списък за доставчик.

Заявка

SELECT 
   Expenses_ranked.supplier 
 , AVG(Expenses_ranked.cost / Expenses_ranked.quantity) AS AVG
FROM ( 

  SELECT 
   * 
   , CASE 
       WHEN @supplier = supplier
       THEN @rank := @rank + 1 
       ELSE @rank := 1
     END 
      AS rank
   , @supplier := supplier 
   FROM 
     Expenses 
   CROSS JOIN (
    SELECT
       @supplier := NULL
     , @rank := 0
    ) 
    AS
      init_user_params  
   WHERE
      product_id = 1       
   ORDER BY
      supplier ASC 
    , DATE DESC   
)
 AS Expenses_ranked 
WHERE
  Expenses_ranked.rank <= 3
GROUP BY
  Expenses_ranked.supplier 

Резултат

supplier  avg           
--------  --------------
       1  2.4933333333  
       2  3.1666666667  

Сега можем да използваме прост ORDER BY [] ASC LIMIT 1 за да получите най-евтиния доставчик

Заявка

SELECT 
 Expenses_ranked_avg.supplier AS cheapest_supplier
FROM ( 

  SELECT 
     Expenses_ranked.supplier 
   , AVG(Expenses_ranked.cost / Expenses_ranked.quantity) AS AVG
  FROM ( 

    SELECT 
     * 
     , CASE 
         WHEN @supplier = supplier
         THEN @rank := @rank + 1 
         ELSE @rank := 1
       END 
      AS rank
   , @supplier := supplier 
   FROM 
     Expenses 
   CROSS JOIN (
    SELECT
       @supplier := NULL
     , @rank := 0
    ) 
    AS
      init_user_params  
   WHERE
      product_id = 1       
   ORDER BY
      supplier ASC 
    , DATE DESC   
    )
      AS
        Expenses_ranked 
    WHERE
      Expenses_ranked.rank <= 3
    GROUP BY
      Expenses_ranked.supplier 
)
  AS Expenses_ranked_avg 
ORDER BY 
 Expenses_ranked_avg.avg ASC
LIMIT 1

Резултат

cheapest_supplier  
-------------------
                  1

По-оптимални заявки.

Какво също е възможно да се декларират потребителските променливи в израза where. Прави директно възможно филтрирането на класирането.

Заявка

  SELECT 
   *
  FROM
   Expenses 
  WHERE
   (
     CASE 
       WHEN @supplier = supplier
       THEN @rank := @rank + 1 
       ELSE @rank := 1
     END  
   ) 
 AND
   (@supplier := supplier )
 AND  
   @rank <= 3  
 AND  
   product_id = 1
ORDER BY 
   supplier ASC
 , DATE ASC  

Резултат

    id  product_id  cost    quantity  supplier  date        
------  ----------  ------  --------  --------  ------------
     1           1  2.99           1         1  2017-09-05  
     3           1  2.50           1         1  2017-09-20  
     4           1  3.98           2         1  2017-09-22  
     2           1  3.00           2         2  2017-09-10  
     5           1  4.00           1         2  2017-09-25  
     6           1  8.00           2         2  2017-09-27 

Сега е лесно да използвате този набор от резултати, за да намерите най-евтиния доставчик.

Заявка

SELECT 
   Expenses_ranked.supplier AS cheapest_supplier
FROM (  

  SELECT 
   *
  FROM
   Expenses 
  WHERE
   (
     CASE 
       WHEN @supplier = supplier
       THEN @rank := @rank + 1 
       ELSE @rank := 1
     END  
   ) IS NOT NULL 
 AND
   (@supplier := supplier ) IS NOT NULL
 AND  
   @rank <= 3  
 AND  
   product_id = 1
ORDER BY 
   supplier ASC
 , DATE ASC  
)
 AS Expenses_ranked 
GROUP BY
  Expenses_ranked.supplier
ORDER BY 
  AVG(Expenses_ranked.cost / Expenses_ranked.quantity) ASC
LIMIT 1  

Резултат

cheapest_supplier  
-------------------
                  1


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL оператор SELECT към референтна таблица два пъти

  2. MySQL съпоставяне за съхраняване на многоезични данни на неизвестен език

  3. Трябва ли MySQL да има часова зона на UTC?

  4. Как да поправя този цикъл за показване на изображения от моята база данни с помощта на въртележка за първоначално зареждане

  5. Как да накарам Django да работи с MySQL в XAMPP?