0

私はクエリを作成して、1か月(開始から現在まで毎月)のトップ顧客を確認できるようにしています。

今、私はテーブルを持っています:

注文(、、、、、、)orderID_ orderdate_ customerID_ Netamount_taxtotalamount

オーダーライン(、、、、、orderlineID_ orderID_prodIDquantityorderdate

顧客firstname lastname zip creditcardtypeなど)

他のテーブルは必ずしもここにあるとは限らないと思います。

もちろん、一度も購入したことがないお客様もいれば、すでに何度も購入したお客様もいます。

今、私はこのクエリを使用しました:

    SELECT customerid, Sum(netamount) 
    FROM orders
    GROUP BY customerid limit 1000000;

これで、すでにsthを購入したすべての顧客が表示されます。彼らが支払った合計金額で。

クエリで

    SELECT YEAR ( Orderdate ) Year ,
    MONTHNAME ( Orderdate ) Month ,
    COUNT(*) TotOrd ,
    FROM orders
    GROUP BY YEAR ( Orderdate ),
    MONTH ( Orderdate );

各行にYear Month Total order(その月に配置)が表示されるテーブルが表示されます。

それでも、1か月のトップ顧客に会いたいだけです。

私はインターネットでたくさん検索しましたが、それでも私が欲しいものを見つけることができませんでした(たぶん私は間違ってググっただけです)。少なくとも1つのインラインビューが必要であることはわかっていますが、それを実現する方法がまだわかりません。

誰かがここで私を助けてくれることを願っています。

4

2 に答える 2

0

トップカスタマーを獲得するには、データに再度参加する必要があります。したがって、最初に各月の最大金額を計算してから、再度参加してその金額を顧客に提供します。

select my.year, my.month, myc.customerid, myc.totord
from (select year, month, max(totord) as maxtotord
      from (SELECT YEAR ( Orderdate ) Year, MONTHNAME ( Orderdate ) Month, customerid, COUNT(*) TotOrd ,
            FROM orders
            GROUP BY YEAR ( Orderdate ), MONTH ( Orderdate ), customerid
           ) myc
      group by year, month
     ) my join
     (SELECT YEAR ( Orderdate ) Year, MONTHNAME ( Orderdate ) Month, customerid, COUNT(*) TotOrd ,
      FROM orders
      GROUP BY YEAR ( Orderdate ), MONTH ( Orderdate ), customerid, count(*) as totord
     ) myc
     on my.year = myc.year and my.month = myc.month and my.maxtotord = myc.totord

これはテストされていないため、構文エラーが発生する可能性があることに注意してください。

また、最大値を持つ複数の顧客が存在する場合、これは複数の顧客を返します。

最後に、ほとんどのデータベースがこの機能をサポートするようになったため、これは他のほとんどのデータベースでははるかに簡単ですrow_number()

于 2013-03-23T22:46:48.903 に答える
0

これはグループごとの最大の問題ですが、残念ながらMySQLはウィンドウ関数またはCTEをサポートしていないため、これは厄介な場合があります。

SELECT s1.year,s1.month,s1.customerid,s1.totord FROM
(SELECT YEAR ( Orderdate ) Year ,
MONTHNAME ( Orderdate ) Month , 
customerid,
COUNT(*) TotOrd 
FROM orders
GROUP BY YEAR ( Orderdate ),
MONTH ( Orderdate ),customerid) as s1
LEFT JOIN
(SELECT YEAR ( Orderdate ) Year ,
MONTHNAME ( Orderdate ) Month , 
customerid,
COUNT(*) TotOrd 
FROM orders
GROUP BY YEAR ( Orderdate ),
MONTH ( Orderdate ),customerid) as s2
ON
s1.year=s2.year AND s1.month=s2.month AND s2.TorOrd>s1.TotOrd AND s1.customerid>s2.customerid
WHERE s2.customerid IS NULL;

ダブルスの場合、より低いIDで顧客を返します。

于 2013-03-23T22:56:29.733 に答える