簡體   English   中英

MySQL每月獲取累積的客戶交易(不是SQL交易)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM