sql >> データベース >  >> RDS >> Mysql

複数のテーブルのデータを使用して最新の平均価格を計算するMySQLクエリ

    オプションは、ユーザー変数を操作して日付に基づいてランキングを生成するクエリです。最後の3つの日付のみを選択します。

    クエリ

    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. JOINとINNERJOINの違い

    2. 性別男性のグループ内のすべてのユーザーをレールします

    3. SQLServerXML列の値をクエリするにはどうすればよいですか

    4. SQLServerのDELETEテーブルとTRUNCATEテーブルの違い