2017-04-04 11 views
2

私は顧客ID、ロケーションID、およびその順序値を持つテーブルを持っていることにより、顧客の最大の場所を見つけます。

SELECT 
    a.CUST 
    ,a.LOC 
    ,c.BOOKINGS 
FROM (SELECT DISTINCT TOP 1 b.CUST, b.LOC, sum(b.ORDER_VAL) as BOOKINGS 
    FROM ORDER_TABLE b 
    GROUP BY b.CUST, b.LOC 
    ORDER BY BOOKINGS DESC) as c 
INNER JOIN ORDER_TABLE a 
    ON a.CUST = c.CUST 

しかし、それは単に返す:私はこのような何かを試してみましたので、私は

Customer | Location | Order $ 
1   | 1A   | 120 
2   | 2B   | 70 

になるだろう

Customer | Location | Order $ 
1   | 1A   | 100 
1   | 1A   | 20 
1   | 1B   | 100 
2   | 2A   | 50 
2   | 2B   | 20 
2   | 2B   | 50 

を過ごす最大で各顧客のための場所のIDを選択する必要がありますトップオーダー。

+0

と一致Q_1から顧客、場所、合計(オーダー)を選択? –

+0

なぜ 'MySQL'タグを削除するのですか?同じ顧客からの場所間の結びつきをどのように処理したいのですが、これは発行ですか? –

答えて

0

ただ、これは私がそれを処理したい方法ですROW_NUM()

DEMO

SELECT * 
FROM (SELECT `Customer`, `Location`, SUM(`Order`) as `Order`, 
       @rn := IF(@customer = `Customer`, 
         @rn + 1, 
         IF(@customer := `Customer`, 1, 1) 
         ) as rn 
     FROM Table1 
     CROSS JOIN (SELECT @rn := 0, @customer := '') as par 
     GROUP BY `Customer`, `Location` 
     ORDER BY `Customer`, SUM(`Order`) DESC 
    ) t 
WHERE t.rn = 1 
+0

それはそれをしました。 Customerによって行に番号が付けられ、ROW = 1のすべての行が使用されます。ありがとう! – noxdogcloud

0

あなたが場所ごとに値を合計する必要がファーズ:

select Customer, Location, Sum(Order) as tot_order 
from order_table 
group by Customer, Location 

あなたはMAXで最大次数を得ることができ、かつ合計で注文したすべての場所を返しますGROUP_CONCATの組み合わせでトップの位置、 DESC、そして唯一トップ1を得るためにSUBSTRING_INDEX:

select 
    Customer, 
    substring_index(
    group_concat(Location order by tot_order desc), 
    ',', 1 
) as location, 
    Max(tot_order) as max_order 
from (
    select Customer, Location, Sum(Order) as tot_order 
    from order_table 
    group by Customer, Location 
) s 
group by Customer 

(同じトップ順序とのタイ、2箇所がありますならば、このクエリは1つだけ返されます)

0

方法について:

select a.* 
from (
    select customer, location, SUM(val) as s 
    from orders 
    group by customer, location 
    ) as a 
left join 
    (
    select customer, MAX(b.tot) as t 
    from ( 
     select customer, location, SUM(val) as tot 
     from orders 
     group by customer, location 
     ) as b 
     group by customer 
    ) as c 
on a.customer = c.customer where a.s = c.t; 
+0

それはちょうど各場所の注文値を返しますが、私に最も貴重な場所を与えません。 – noxdogcloud

+0

編集を参照してください、あなたの質問を完全に把握していません – rlbaker

0

をエミュレートするために変数を使用する - 私が書いた(そうでないかもしれない最良の方法は?)最初にCTEを使用し、MySQLがCTEをサポートしていないことを確認した後、同じサブクエリを2回書き込むように切り替えました。

SELECT B.Customer, C.Location, B.MaxOrderTotal 
FROM 
(
    SELECT A.Customer, MAX(A.OrderTotal) AS MaxOrderTotal 
    FROM 
    (
     SELECT Customer, Location, SUM(`Order`) AS OrderTotal 
     FROM Table1 
     GROUP BY Customer, Location 
    ) AS A 
    GROUP BY A.Customer 
) AS B INNER JOIN 
(
    SELECT Customer, Location, SUM(`Order`) AS OrderTotal 
    FROM Table1 
    GROUP BY Customer, Location 
) AS C ON B.Customer = C.Customer AND B.MaxOrderTotal = C.OrderTotal; 

編集:

同点の場合に複数の行を提供する。この溶液を設けたテーブル構造を使用します。 SQL fiddle for this solution

0

これは集合関数の問題を使用しているようです。ここに私の刺し傷があります。

SELECT 

    c.customer, 
    c.location, 

    SUM(`order`) as `order_total`, 
    (
    SELECT 

    SUM(`order`) as `order_total` 

    FROM customer cm 


    WHERE cm.customer = c.customer 
    GROUP BY location 
    ORDER BY `order_total` DESC LIMIT 1 

) as max_order_amount 


FROM customer c 
GROUP BY location 
HAVING max_order_amount = order_total 

ここはSQLフィドルです。 http://sqlfiddle.com/#!9/2ac0d1/1

0
with 
Q_1 as 
(
select customer,location, sum(order_$) as order_sum 
from cust_order 
group by customer,location 
order by customer, order_sum desc 
), 

Q_2 as 
(
    select customer,max(order_sum) as order_max 
    from Q_1 
    group by customer 
), 

Q_3 as 
(
    select Q_1.customer,Q_1.location,Q_1.order_sum 
    from Q_1 inner join Q_2 on Q_1.customer = Q_2.customer and Q_1.order_sum = Q_2.order_max 
) 

select * from Q_3 

Q_1は - 通常の集計を選択し、Q_2は - Q_1とQ_3のうちの最大値(集計)を選択Q_2

DBMSを使用している
+0

このコードのみの回答についての説明が役に立ちます。 – Pyves