-2

次のようなテーブルがあります。

    id | Customer  | date
-----------------------------------------
    1  | Customer2 | 2013-08-01 00:00:00
-----------------------------------------
    2  | Customer1 | 2013-07-15 00:00:00
-----------------------------------------
    3  | Customer1 | 2013-07-01 00:00:00
-----------------------------------------
    .  | ...       | ...
-----------------------------------------
    n  | CustomerN | 2012-03-01 00:00:00

別のテーブル/ビューで行ったとしても、毎月の「獲得した」顧客、毎月の「失った」顧客、および毎月の純利益を計算したいと考えています。

どうやってやるの?

編集

わかりました、私がこれまでに行ったことを示しましょう。

任意の月の獲得した顧客を選択するために、次のものが存在しない予約テーブルから顧客を選択しようとしました:

select Customer
from Bookings
where not exists
  (select Customer
   from Bookings
   where
     (Bookings.date BETWEEN
          DATE_FORMAT(DATE_SUB(Bookings.date, INTERVAL 1 MONTH), '%Y-%m-01 00:00:00')
          AND DATE_FORMAT(Bookings.date, '%Y-%m-01 00:00:00'
     )
) AND Bookings.date >= STR_TO_DATE('2010-11-01 00:00:00', '%Y-%m-%d 00:00:00'))

これは、「選択された」月には存在したが、前の月には存在しなかった顧客を取得すると思われます。「2010-11-01」は予約開始日+1ヶ月。

任意の月の失われた顧客を選択するために、次のものが存在しない予約テーブルから顧客を選択しようとしました:

select Customer
from Booking
where not exists
  (select Customer
   from Bookings
   where
     (Bookings.date BETWEEN
          DATE_FORMAT(Bookings.date, '%Y-%m-01 00:00:00')
          AND Bookings.date
     )
     AND Bookings.date >= STR_TO_DATE('2010-11-01 00:00:00', '%Y-%m-%d 00:00:00'
  )
)

これはおそらく、前の月に存在したが「選択された」月には存在しなかった顧客を取得します。

「損失」SQL クエリの場合、空の結果が得られました。「ゲイン」については、何千行も取得しましたが、それが正確かどうかはわかりません。

4

1 に答える 1

0

COUNT DISTINCT を使用して顧客を数え、WHERE YEAR(Date) = [年] AND MONTH(Date) = [month] を使用して月を取得できます。

2013 年 9 月の合計顧客数:

SELECT COUNT(DISTINCT Customer) AS MonthTotalCustomers FROM table
WHERE YEAR(date) = 2013 AND MONTH(date) = 9

2013 年 9 月に獲得した顧客:

SELECT COUNT(DISTINCT Customer) AS MonthGainedCustomers FROM table
WHERE YEAR(date) = 2013 AND MONTH(date) = 9
AND Customer NOT IN 
    (SELECT Customer FROM table 
    WHERE date < '2013-09-01')

失われた顧客を把握することはより困難です。どのような基準でそれらが「失われた」と見なされるかを知る必要があります。2013 年 8 月には存在していたが、2013 年 9 月には存在していなかったというだけの場合:

SELECT COUNT(DISTINCT Customer) AS MonthLostCustomers FROM table
WHERE YEAR(date) = 2013 AND MONTH(date) = 8
AND Customer NOT IN 
    (SELECT Customer FROM table 
    WHERE YEAR(date) = 2013 AND MONTH(date) = 9)

これらの例から、探しているものを推定できることを願っています。

于 2013-10-09T01:13:37.697 に答える