1

ご意見、アドバイス、提案をお寄せいただきありがとうございます。

システム: 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;
4

2 に答える 2

0

通常、このような状況で私がすることは次のようなものです

SELECT  CustormerID,
        SUM(
            CASE
                WHEN OrderDate > @ThreeMonthsAgo AND OrderDate <= @CurrentDate
                    1
                ELSE 0
            END
           ) InLast3Months,        
        SUM(
            CASE
                WHEN OrderDate > @SixMonthsAgo AND OrderDate <= @ThreeMonthsAgo 
                    1
                ELSE 0
            END
           ) InLast3To6Months,
        ...
FROM YourTable
GROUP BY CustomerID

これにより、示されているように事前にバケットを変数として決定し、次にどのバケットにいくつのアイテムが含まれるかをカウントできます。

于 2013-09-12T13:49:36.693 に答える