2017-01-11 18 views
0

AccountHistoryAccessHistoryという2つのテーブルがあります。 AccountHistoryテーブルには、顧客がいつアクティベートされたかについての詳細が含まれています(1回のみ)。同様に、AccessHistoryテーブルには、顧客が当社のサイトにログインしたときの詳細(複数回)が含まれています。SQL - 2つの異なるテーブルの日付を使用した条件別グループ

AccountHistory:

ID HistoryDt CustomerID 
-- --------- ---------- 
1 2016-01-02   1 
2 2016-02-01   2 

AccessHistory:

ID AccessDt CustomerID 
-- --------- ---------- 
1 2016-01-02   1 
2 2016-02-01   2 
3 2016-02-05   2 
4 2016-03-06   1 

は、私は多くのnew顧客が特定の月でサイトにログインする方法を示したレポートを生成するためのクエリを記述します。

たとえば、上記の表の例では、カスタマー2は2月にアクティベートし、彼は2回ログインしました。また、顧客1は1月に活動化され、3月にもログインしました。

私はSQLに新しいですので、だから、出力が

NewUsersAccess  Month 
-------------  ----- 
      1   1 
      2   2 
      0   3 

だろう、私はこのようなサブクエリ使用して、粗クエリを書くことを考えることができます。

select COUNT(*) from AccessHistory 
where CustomerID in 
(select DISTINCT(CustomerID) from AccountHistory where HistoryDt > '2015-12-31' 
and HistoryDt < '2016-02-01') and AccessDt > '2015-12-31' 
and AccessDt < '2016-02-01' 

をしかし、それだけでデータをフェッチすることができます月に一度に誰かがより良い選択肢を提案してもらえますか?

答えて

1

あなたはGROUP BYを探しています:

select year(ath.historyDt), month(ath.historyDt), count(ath.CustomerId) 
from AccountHistory ath left join 
    AccessHistory ah 
    on ah.CustomerID = ath.CustomerID and 
     ah.accessDt >= ath.historyDt and 
     ah.accessDt < dateadd(day, 1, eomonth(ath.historyDt)) 
group by year(ath.historyDt), month(ath.historyDt); 

注日付の計算は、月の最後の日付を取得するにはeomonth()機能を使用していることを - して、不平等のためにもう1日追加します。

また、お客様が実際に開始する月のみが含まれます。 "0"値を取得することは、クエリを少し複雑にする少し異なる問題です。

+0

はい!これは私の問題を解決します。私は日付列として混乱していました。しかし、それを修正した後、私の問題を解決します。ありがとう! – nitinvertigo

+0

@nitinvertigo。 。 。名前は私にも混乱させた(「アクセス」は朝の「アカウント」に似ている)。 'left join 'は、アクセステーブルではなく履歴テーブルから開始する必要があります。私はそれが今修正されたと思う。 –

+0

名前を明確にして申し訳ありません.1つの小さな質問。顧客のアクセスの詳細のレコードが含まれているため、AccessHistoryテーブルから日付を取得するべきではありません。クエリの最初の行では、それはah.historyDtであり、グループでもath.HistoryDtです。私が間違っていれば私を修正してください。 – nitinvertigo

関連する問題