[英]MySQL Get cumulative customer transactions (not SQL transactions) on a monthly basis
:)
我有一個簡單的表,里面有交易,沒有花哨的事,我想每月獲得多少交易是“第一筆交易”。 所謂第一筆交易,是指客戶首次購買。
我想要得到的結果是以下形式的:
+---------+----------------------------+------------------+
| Date | First Purchases In Month | Cumulative Sum |
+---------+----------------------------+------------------+
| 01/2015 | 10 | 10 |
+---------+----------------------------+------------------+
| 02/2015 | 40 | 50 |
+---------+----------------------------+------------------+
日期格式並不重要,它可以是一個完整的日期,無論如何我稍后將在Java中對其進行解析。
我發現這篇文章雖然每天都在做類似的事情
我把它變成了:
set @csum := 0;
SELECT
FirstOrderDate, MonthTotal, @csum:= @csum + MonthTotal AS AccumulatedTotal
FROM
(
SELECT FirstOrderDate, SUM(month_total_new) as MonthTotal
FROM
(
SELECT
FirstOrderDate, COUNT(q1.consumerId) AS month_total_new
FROM
(
SELECT
consumerId, MIN(date) AS FirstOrderDate
FROM
transaction
GROUP BY
consumerId
) AS q1
GROUP BY
EXTRACT(YEAR FROM q1.FirstOrderDate),
EXTRACT(MONTH FROM q1.FirstOrderDate)
) AS s
GROUP BY
EXTRACT(YEAR FROM s.FirstOrderDate),
EXTRACT(MONTH FROM s.FirstOrderDate)
) AS test;
您可以在此處查看其運行情況: http : //sqlfiddle.com/#!9/31538/7
結果似乎是正確的,但是使用這么多內部查詢似乎不是最佳實踐方法。 建議做這種事情的方法是什么?
另外,當一個月中沒有“第一筆交易”時,我希望得到0,而不是根本沒有出現該日期(例如,在我們的小提琴中的三月,那里只有一筆交易而不是“第一筆交易”)。
非常感謝您提前提供的幫助! :)
最簡單的方法是按客戶匯總,以獲取每個客戶的第一筆交易的日期。 然后總結一下:
select year(firstdate) as yyyy, month(firstdate) as mm,
count(*) as NumFirsts
from (select consumerid, min(date) as firstdate
from transaction
group by consumerid
) c
group by year(firstdate), month(firstdate)
order by year(firstdate), month(firstdate);
如果您正在用Java閱讀此內容,則可能只想在那里做累積和。 否則,您可以在MySQL中使用變量進行操作:
select c.*, (@s := @s + NumFirsts) as CumeFirsts
from (select year(firstdate) as yyyy, month(firstdate) as mm,
count(*) as NumFirsts
from (select consumerid, min(date) as firstdate
from transaction
group by consumerid
) c
group by year(firstdate), month(firstdate)
) c cross join
(select @s := 0) params
order by yyyy, mm;
用零個第一筆交易處理幾個月也是一件痛苦的事情。 如果您有日歷表或知道一個月內有一些交易,它會有所幫助。 例如,您可以執行以下操作:
select ym.yyyy, ym.mm, coalesce(NumFirsts, 0) as NumFirsts,
(@s := @s + coalesce(NumFirsts, 0)) as CumeFirsts
from (select distinct year(date) as yyyy, month(date)
from transactions
) ym left join
(select year(firstdate) as yyyy, month(firstdate) as mm,
count(*) as NumFirsts
from (select consumerid, min(date) as firstdate
from transaction
group by consumerid
) c
group by year(firstdate), month(firstdate)
) c
on c.yyyy = ym.yyyy and c.mm = y.mm cross join
(select @s := 0) params
order by yyyy, mm;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.