ご意見、アドバイス、提案をお寄せいただきありがとうございます。
システム: SQL Server 2008 R2
特定の顧客について、いくつかの異なる時間間隔 (日付範囲) 内の再購入数を数え、これらの数を 1 つの表に表示する必要があります。これは、最終的に結合するいくつかの後続の共通テーブル式 (cte) で機能します。ただし、この方法は面倒であり、かなり非効率的です (パフォーマンス速度の点で)。
最短かつ最速だと思っていた SQL コードは、いくつかの理由で機能せず、次のようなエラー メッセージを返します。または別のエラー メッセージ: 「集計は、HAVING 句または選択リストに含まれるサブクエリ内にない限り、WHERE 句に表示されない場合があり、集計される列は外部参照です。」 以下のサンプル テーブルを参照してください ( WDB)、目的の結果テーブル (WDB_result)、および改善が必要な SQL コードです。
サンプル WDB テーブル:
- CustomerID: 顧客 ID
- InNo: 請求書番号
- OrderDate: 注文日
結果テーブル WDB_result:
コラム
A) 再購入の総数
B) 最初の 3 か月以内の
再購入の数 C) 最初の 6 か月以内の
再購入の数 D) 最初の 12 か月以内の再購入の
数 E) 過去 3 か月間
の再購入の数 F) 再購入の数
G) 過去 12 か月間の再購入数
列 A、B、および E を計算するサンプル SQL コード:
SELECT
CustomerID
, COUNT(InNo) OVER (PARTITION by CustomerID) -1) as Norepurchases_Total
, (SELECT (COUNT(InNo) OVER (PARTITION by CustomerID) -1) as Count3
FROM WDB
WHERE OrderDate between MIN(OrderDate) and DATEADD(month, 3, MIN(OrderDate))
) as Norepurchases_1st_3months
, (SELECT (COUNT(InNo) OVER (PARTITION by CustomerID) -1) as Count3
FROM WDB
WHERE OrderDate between MAX(OrderDate) and DATEPART(y, DATEADD(m, -3, getdate()))
) as NoRepurchases_Last_3months
FROM WDB;