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;
    

    最も内側のクエリは、顧客IDでグループ化されたORDER、ORDER_LINE、およびPRODUCTテーブルを結合して、現在の年の合計購入額を合計します(合計金額の降順で注文します)。 1レベル上のクエリは、内部のクエリ結果を使用して、購入の最大合計を追加します。最も外側のクエリは、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. 正しいクレデンシャルでアクセスが拒否されましたが、何が起こっていますか?

    2. MySQLサーバーのルートパスワードをリセットする

    3. セッション変数:データ量が多すぎますか?

    4. Oracle 11 SQL:1行をx行に分割し、新しい列を挿入します