2011-12-15 2 views
2

私のモデルは、次の行に沿っています:このデータモデルでビジネスの頻繁な顧客を検出するSQLクエリを作成するにはどうすればよいですか?

  • ビジネスにはNの場所があります。
  • ロケーションにNトランザクションがあります。
  • 各取引には顧客があります。
  • 各トランザクションはトランザクショングループに属します。

にはどうすればKは整数ある特定のビジネス、少なくともKトランザクション・グループを持っているすべての顧客を見つけたクエリを書くのですか? (私は結果が与えられた顧客を一度に含むことを望みません)

+0

将来のテーブル構造を簡単に投稿できます。あなたの後ろのアイデアを得るためにテーブルの中に鉛筆を塗る必要がありました。 – JonH

+0

@JonH:明確でないことに対する謝罪。私は次回より明示的になるでしょう。 –

答えて

4

使用having

select 
    c.CustomerID, 
    count(distinct tg.TransactionGroupID) as GroupCount 
from 
    Customers c 
    inner join Transaction t on 
     c.CustomerID = t.CustomerID 
    inner join Location l on 
     t.LocationID = l.LocationID 
    inner join Business b on 
     l.BusinessID = b.BusinessID 
    inner join TransactionGroup tg on 
     t.TransactionGroupID = tg.TransactionGroupID 
where 
    b.BusinessName = 'Some business' 
group by c.CustomerID 
having count(distinct tg.TransactionGroupID) > 4 

トランザクショングループ情報が必要ない場合は、トランザクションテーブルに参加して2回目の参加を控えることができます。

ここでは「4」を使用しましたが、あなたの気に入ったパラメータや別の整数を自由に使用してください。

+0

+1、私にそれを打つ:) –

+0

これはビジネスを参照していないようです。彼らは彼らがどんな仕事をしているにせよ、これはすべての取引を得ることはできませんか? –

+0

ビジネスに参加者を追加しました。 – Eric

1
SELECT Customerid 
From Transaction t 
INNER JOIN TransactionGroup tg 
    ON t.transactionid = tg.transactionid 
GROUP BY Customerid 
HAVING COUNT(DISTINCT TransactionGroup) => @TransactionCountDesired 

これは要点ですので、JOINをさらに展開する必要があります。

お客様がGROUP BYお客様で、HAVINGの取引を確認するためにCOUNT(DISTINCT...)の小切手をお持ちでない場合は、対処する必要がありません。

関連する問題