6

私は何らかの理由でこれについて狂ったように混乱しています。

基本的に、2010 年以降の 1 か月あたりの新規顧客数を見つけるクエリを探しています。

私は顧客の電子メール アドレス (email)、すべての注文 (OrderID)、および注文日 (OrderDate) を持っています。テーブルは tblOrder です。

「新規顧客」とは、(a) その日付/月のに注文したことがない人、および (b)その日付/月のに少なくとも 1 回注文した人であることを知っています。

出力を最終的に次のようにしたいと思いますが、より単純な方法の方が優れています。

      01   02   03   04   05   06   07   08   09   10   11   12
2010  ##   ##   ##   ##   ##   ##   ##   ##   ##   ##   ##   ##
2011  ##   ##   ##   ##   ##   ##   ##   ##   ##   ##   ##   ##
2012  ##   ##   ##   ##   ##   ##   ##   ##   ##   ##   ##   ##

そして、私はこれを使用するように与えられましたが、みんな、私は真剣にプログラマーではありません。一部の人にとっては単純に見えるかもしれませんが、それは私の頭を超えていて、まったくクリックしていません。

SELECT <customer info> 
FROM <customer table> 
WHERE (SELECT COUNT(<order info>) 
    FROM <order table> 
    WHERE <customer info> = <current customer> 
        AND <date> < <target date>) = 0 
        AND (SELECT COUNT(<order info> 
            FROM <order table> 
            WHERE <customer info> = <current customer> 
            AND <date> > <target date>) > 0

これも有効なSQLではないことはわかっています。だから私はそれをどうするかわかりません。そして、私が最終的に望むようにすべてを数えて合計するのではなく、該当する顧客 (入力された月の前に注文していない顧客) のリストを引き出すだけだと思います。

4

5 に答える 5

2

試す:

select yr, [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12]
from
(select datepart(month,minDate) mth, datepart(year,minDate) yr, count(*) cnt
 from (select min(OrderDate) minDate, max(OrderDate) maxDate
       from tblOrder
       group by email) sq
 where datediff(month, minDate, maxDate) > 0
 group by datepart(month,minDate), datepart(year,minDate)) src
PIVOT
(max(cnt) 
 for mth in ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12]) ) pvt

ここでSQLFiddle 。

于 2013-06-21T20:07:25.077 に答える
1

新しい顧客を定義することから始めます

select distinct FirstTimer.customer_id 
from
(select customer_id,min(order_date) as FirstOrderDate
from tblOrder 
group by customer_id
having Month(min(order_date))=month(TargetDate) and
       year(min(order_date))=year(targetDate)
) FirstTimer
join tblOrder ot on ot.customer_id=First_timer.customer_id
where ot.order_date > target_date

最初の部分は、指定された月に最初の注文があったすべての顧客を検索します。次に、2 番目の条件も満たしている (目標日以降に注文された) 顧客のみが必要です。

テーブル名と構造がなければ、クエリ全体を作成することはできませんが、上記が少しの出発点になることを願っています

于 2013-06-21T20:06:41.677 に答える
0

@Mark Ba​​nnister の回答を少し編集します。OP の意図は、最初の注文を行った月までに新規顧客の数を把握することです。OPの「新規顧客」の定義は、彼が次のように指定しているという点で混乱しています。

「新規顧客」とは: (a) その日付/月の前に注文したことがない人、および (b) その日付/月の後に少なくとも 1 回注文した人(強調を追加)

これは本当に OP が望んでいることかもしれませんが、これはより正確には「次の月にリピーターになる新規顧客」と呼ばれます。

  1. 1回のみご注文のお客様
  2. すべての注文を同じ日/月に行う顧客

@Mark のソリューションは、Fred@home が新規顧客としてカウントされていないことを SQL FIDDLEが示しているため、これらの顧客を正しく (?) 排除します。

ただし、OPは投稿の最後で、「該当する顧客」は次のとおりであるとも述べています。

入力した月までに注文していない方

したがって、すべての新しい顧客を獲得するために (これは OP が実際に求めていることだと思います)、@Mark の優れた PIVOT ソリューションを引き続き使用できます。下:

select yr, [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12]
from
(select datepart(month,minDate) mth, datepart(year,minDate) yr, count(*) cnt
 from (select min(OrderDate) minDate
       from tblOrder
       group by email) sq
 group by datepart(month,minDate), datepart(year,minDate)) src
PIVOT
(max(cnt) 
 for mth in ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12]) ) pvt

すべての顧客が捕捉されていることを確認する簡単なチェックは、ピボット テーブル内のすべてのカウントを合計し (Excel ですばやく簡単に)、以下と比較することで実行できます。

SELECT COUNT(DISTINCT(email)) FROM tblOrder
于 2015-12-30T17:45:23.770 に答える
-1
SELECT EXTRACT(MONTH FROM orderdate) AS month,
       EXTRACT(YEAR FROM orderdate)  AS year, 
       COUNT(*) 
FROM (
       SELECT MIN(orderdate) AS orderdate, name
       FROM tblOrder
       GROUP BY name
     )
GROUP BY EXTRACT(MONTH FROM orderdate),
         EXTRACT(YEAR FROM orderdate) 
于 2016-02-10T22:13:55.687 に答える