このクエリを書くのに問題があります。
連続した月に出荷された現在の注文数を取得する必要があります。
例:現在の月が11月で、7月、8月、9月、10月、11月に注文した場合、そのユーザーには5が返されます。11月に注文しなかった場合、ストリークが壊れているため、0が返されます。
私が関わっているテーブルは、、、customer
およびorder
ですdate
。
このクエリを書くのに問題があります。
連続した月に出荷された現在の注文数を取得する必要があります。
例:現在の月が11月で、7月、8月、9月、10月、11月に注文した場合、そのユーザーには5が返されます。11月に注文しなかった場合、ストリークが壊れているため、0が返されます。
私が関わっているテーブルは、、、customer
およびorder
ですdate
。
Here you replace now and static date as per columnname :
select (case
when (month(now())=11 and
(month('2012-02-02')>=7 and month('2012-02-02')<=11))
then 5
else
0 end) as 'month'
from tablename
日付テーブルと顧客テーブルの間のクロス結合を使用して、すべての顧客/月の組み合わせの行を取得し、次にそれを注文テーブルに対して左結合して詳細を取得し、groupbyを使用してカウントを取得します。
このようなものですが、予約語である列名に対応するために変更する必要があります。
SELECT customer.name, month.name, COUNT(order.id)
FROM customer
CROSS JOIN date
LEFT OUTER JOIN order
ON customer.id = order.customer_id
AND MONTH(date.date) = MONTH(order.date)
WHERE date.date BETWEEN startofdaterange AND endofdaterange
GROUP BY customer.name, month.name
または、質問を読み間違えた場合、範囲内で毎月注文する場合は注文数をカウントする必要があり、月をスキップする場合は0が必要です(テストされていないため、タイプミスまたは2が必要になるため、テーブルが必要になります)テストするdef):-
SELECT name, CASE WHEN MonthCount = MonthOrderCount THEN OrderCount ELSE 0 END AS ContinuousOrderMonths
FROM (
SELECT CustName, COUNT(MonthName) AS MonthCount, SUM(MonthOrderCount) AS OrderCount, SUM(CASE WHEN MonthOrderCount > 0 THEN 1 ELSE 0 END)
FROM (
SELECT customer.name AS CustName, month.name AS MonthName, COUNT(order.id) AS MonthOrderCount
FROM customer
CROSS JOIN date
LEFT OUTER JOIN order
ON customer.id = order.customer_id
AND MONTH(date.date) = MONTH(order.date)
WHERE date.date BETWEEN startofdaterange AND endofdaterange
GROUP BY customer.name, month.name )Sub1 ) Sub2
GROUP BY CustName
顧客のリストと1か月あたりの注文のコンマ区切りリストが必要な場合:-
SELECT CustName, GROUP_CONCAT(CAST(MonthsOrder AS CHAR))
FROM (
SELECT customer.name AS CustName, month.name, COUNT(order.id) AS MonthsOrder
FROM customer
CROSS JOIN date
LEFT OUTER JOIN order
ON customer.id = order.customer_id
AND MONTH(date.date) = MONTH(order.date)
WHERE date.date BETWEEN startofdaterange AND endofdaterange
GROUP BY customer.name, month.name) Sub1
GROUP BY CustName
これを展開して、それぞれの月の名前を取得し、注文を強制する必要がある場合があります