2017-03-05 9 views
0

私はIBMによるDB2を使用しています。しかし、私はこれが各DBメーカーによって追加された追加機能を使用せずにSQL標準を使用して行われることを望んでいます。共通の構成要素については、どのように2列に基づいて値を見つけるには? SQL

私の問題:

すべてのCID(顧客ID)のために、私はほとんどの購入が行われたからCLUBを見つける必要があります。以下の表に

、顧客#1(「CID = 1」) 'ダイジェスト読者のクラブから最も本を買いました。

enter image description here

Find most frequent value in SQL columnしかしCID = 2は、(私にとっては)はるかに困難である、と私は立ち往生午前:私は使用して行われ、この部分を取得することができます。 「CID = 2」のために我々は「CLUB」列の下に、最も一般的に発生刺さは「オプラ」と「YRBゴールド」の間のタイであることがわかります - しかし、我々は「QNTY」欄を見ると、それは人々に(明らかになり)は、 'cid = 2'の最終回答は 'YRB_gold'です。 「YRB_GOLD」は5冊を販売しました。「OPRAH」は4冊しか販売していませんでした。

enter image description here

は、私がここにも 'CID = 3' を置く:

enter image description here

は47人の顧客(CID)があります。私の質問は、どのようにすべての「CID」を踏んで、どのクラブを「CLUB」の中で最も一般的に発生している文字列を考慮すると同時に、すべてのクラブの「QNTY」を把握していますか?あなたが助けを選ぶならば、最もOEMの中立的な答えを提供できますか?前もって感謝します。

****************************** EDIT#1 ************* ****************************以下の答えを

感謝。現在、私はそれを動作させる問題を抱えています。

テーブル名は 'yrb_purchase'です。 私はすべてを入力すると: SELECT cid, club, qnty AS q1 FROM (SELECT cid, club, sum(qnty) AS q2, row_number() OVER (PARTITION BY cid ORDER BY sum(q2) DESC) AS seqnum FROM yrb_purchase GROUP BY cid, club) cc WHERE seqnum = 1

私はエラーを取得する:SQL0206N "Q2" is not valid in the context where it is used. SQLSTATE=42703

は現在、これを修正する方法を把握しようとに取り組んで。

答えて

1

あなたが探している値には名前があります。統計的には、これは「モード」と呼ばれます。

私が正しく理解している場合は、それぞれclubの合計数量と、それぞれcidの最高数量が必要です。あなたはネクタイを処理する方法に応じて、row_number()またはrank()を使用することができます。

select cid, club, qty 
from (select cid, club, sum(qty) as qty, 
      row_number() over (partition by cid order by sum(qty) desc) as seqnum 
     from t 
     group by cid, club 
    ) cc 
where seqnum = 1; 

が結びつきがあり、あなたはすべての値をしたい場合は、代わりにrow_number()rank()を使用しています。

関連する問題