Đếm số lượng khách hàng quay lại mua hàng trong một khoảng thời gian

Liên hệ QC

kelacloi

Thành viên thường trực
Tham gia
6/11/14
Bài viết
331
Được thích
156
Giới tính
Nam
Chào các bác, anh, chị,

Em có bài toán liên quan đến PBIX cần xử lý như sau:

Data có 3 cột chính: Mã khách hàng, ngày đặt hàng, tên mặt hàng.

Bài toán cần xử lý: Sau khi đưa vào Power BI, em cần thống kê như sau:
Dựa vào mã khách hàng, một khách hàng là một mã, mã này không thay đổi (kiểu như user name), khách hàng có thể đặt hàng các ngày khác nhau, các mặt hàng khác nhau:

Yêu cầu: Tạo báo cáo để khi chọn 1 khoảng thời gian bất kỳ trên report (thời gian dựa vào cột "ngày đặt hàng") thì thống kê được:
1: Trong khoảng thời gian đó: Có bao nhiêu khách hàng đặt hàng 1 lần, 2 lần, 3 lần,...
2.: Có bao nhiêu khách hàng đã quay lại mua hàng mà đã mua hàng trong khoảng thời gian liền kề 6 tháng trươc đó. Ví dụ: Nếu chọn khoảng thời gian là 1-Jan-2021 đến 1-Feb-2021 thì khoảng thời gian 6 tháng liền kề trước đó là 6 tháng tính đến ngày 31-Dec-2020.

(Vì em không đính kèm được file PBIX nên em đã cho nó vào file .rar)

Cảm ơn mọi người.
1626065052905.png
Bài đã được tự động gộp:
 

File đính kèm

  • GPB_Ques.rar
    58.3 KB · Đọc: 48
Chào các bác, anh, chị,

Em có bài toán liên quan đến PBIX cần xử lý như sau:

Data có 3 cột chính: Mã khách hàng, ngày đặt hàng, tên mặt hàng.

Bài toán cần xử lý: Sau khi đưa vào Power BI, em cần thống kê như sau:
Dựa vào mã khách hàng, một khách hàng là một mã, mã này không thay đổi (kiểu như user name), khách hàng có thể đặt hàng các ngày khác nhau, các mặt hàng khác nhau:

Yêu cầu: Tạo báo cáo để khi chọn 1 khoảng thời gian bất kỳ trên report (thời gian dựa vào cột "ngày đặt hàng") thì thống kê được:
1: Trong khoảng thời gian đó: Có bao nhiêu khách hàng đặt hàng 1 lần, 2 lần, 3 lần,...
2.: Có bao nhiêu khách hàng đã quay lại mua hàng mà đã mua hàng trong khoảng thời gian liền kề 6 tháng trươc đó. Ví dụ: Nếu chọn khoảng thời gian là 1-Jan-2021 đến 1-Feb-2021 thì khoảng thời gian 6 tháng liền kề trước đó là 6 tháng tính đến ngày 31-Dec-2020.

(Vì em không đính kèm được file PBIX nên em đã cho nó vào file .rar)

Cảm ơn mọi người.
View attachment 262269
Bài đã được tự động gộp:
Tạo thêm 3 bảng Date (có relationship voi Data_test), bảng Num (số lần), bảng Số tháng liền kề, nếu đúng ý bạn thì tiếp tục1626072747115.png
 

Updated: Chỉ cần dùng count với cách đếm duy nhất, bỏ qua blank.

Đã ok.

Nếu thêm một measure để tính "tổng số khách đặt hàng" theo khoảng thời gian được chọn (chỗ Date) nhưng không quan tâm đến số lần đặt mua thì thêm kiểu gì anh nhỉ?

Bởi vì cái measure "số lượng khách hàng đặt mua" đang link với số lần.

Cảm ơn anh
 
Lần chỉnh sửa cuối:
Updated: Chỉ cần dùng count với cách đếm duy nhất, bỏ qua blank.

Đã ok.

Nếu thêm một measure để tính "tổng số khách đặt hàng" theo khoảng thời gian được chọn (chỗ Date) nhưng không quan tâm đến số lần đặt mua thì thêm kiểu gì anh nhỉ?

Bởi vì cái measure "số lượng khách hàng đặt mua" đang link với số lần.

Cảm ơn anh
Chưa hiểu ý bạn ta, bạn đưa kết quả bạn muốn rồi chụp hình lên tôi xem thử!
 
Chưa hiểu ý bạn ta, bạn đưa kết quả bạn muốn rồi chụp hình lên tôi xem thử!

Nếu có muốn đếm số khách hàng như trên và thêm một điều kiện nữa là:
Nếu khách hàng mua hàng mà thời gian đặt hàng cách nhau nhỏ hơn 4 ngày thì chỉ tính là mua hàng một lần thì có xử lý được không anh nhỉ?

Ví dụ: khách hàng "KH0001" mua hàng ngày 1 Jan 2021 sau đấy đến ngày 3 Jan 2021 lại mua tiếp thì chỉ tính là một lần mua hàng, miễn là đối với 1 khách hàng thì 2 lần liên tiếp mua hàng phải cách nhau ít nhất 4 ngày thì mới tính là 1 lần.
Nhưng khách hàng "KH001" mua hàng ngày 1 Jan 2021 sau đấy ngày 4 Jan 2021 lại mua thì tính là 2 lần.
Mốc thời gian dùng để xử lý bắt đầu từ ngày cũ nhất trong cột "Ngày đặt hàng" (em nghĩ là min của cột "ngày đặt hàng")
1626158679837.png

Với các yêu cầu như thế thì có cách nào để xứ lý không anh nhỉ?
 
Nếu có muốn đếm số khách hàng như trên và thêm một điều kiện nữa là:
Nếu khách hàng mua hàng mà thời gian đặt hàng cách nhau nhỏ hơn 4 ngày thì chỉ tính là mua hàng một lần thì có xử lý được không anh nhỉ?

Ví dụ: khách hàng "KH0001" mua hàng ngày 1 Jan 2021 sau đấy đến ngày 3 Jan 2021 lại mua tiếp thì chỉ tính là một lần mua hàng, miễn là đối với 1 khách hàng thì 2 lần liên tiếp mua hàng phải cách nhau ít nhất 4 ngày thì mới tính là 1 lần.
Nhưng khách hàng "KH001" mua hàng ngày 1 Jan 2021 sau đấy ngày 4 Jan 2021 lại mua thì tính là 2 lần.
Mốc thời gian dùng để xử lý bắt đầu từ ngày cũ nhất trong cột "Ngày đặt hàng" (em nghĩ là min của cột "ngày đặt hàng")
View attachment 262354

Với các yêu cầu như thế thì có cách nào để xứ lý không anh nhỉ?
Vậy mua ngay 1/1, 4/1, 5/1 thì tính 2 hay 3 lần ?
 
Tức là khoảng cách giữa 2 lần mua là 4 ngày đúng không bạn?
Đúng rồi anh ạ.
2 lần mua được đếm là 2 lần nếu thời gian 2 lần mua cách nhau từ 4 ngày trở lên.
Còn kể cả mua rất nhiều lần trong khoảng thời gian 4 ngày thì đều chỉ được xem là mua hàng 1 lần.
Ví dụ: Khách hàng A mua hàng N lần trong năm thì 2 lần bất kỳ trong N lần đó phải có thời gian mua cách nhau ít nhất 4 ngày anh ạ.
 
Đúng rồi anh ạ.
2 lần mua được đếm là 2 lần nếu thời gian 2 lần mua cách nhau từ 4 ngày trở lên.
Còn kể cả mua rất nhiều lần trong khoảng thời gian 4 ngày thì đều chỉ được xem là mua hàng 1 lần.
Ví dụ: Khách hàng A mua hàng N lần trong năm thì 2 lần bất kỳ trong N lần đó phải có thời gian mua cách nhau ít nhất 4 ngày anh ạ.
Dựa vào file pibx tôi gửi trên, bạn viết thêm một measure như vầy, sửa khoảng cách các lần đặt hàng ở dấu mũi tên trong hình, hoặc tạo một disconnect table đưa slicer vào điều khiển tự động, đang cài chênh lệch 3 ngày (4/1 - 1/1 =3)1626171930368.png
 
Em viết đoạn này thì báo lỗi chỗ "var tbl3" là sao anh nhỉ?
1626173993128.png

Mã:
So ngay dat hang_2 =
var tbl = VALUES('DB Sales'[Captured Date])
var tbl2 = ADDCOLUMNS(tbl,
                        "Ngay gan nhat",
                     var _date=[Captured Date]
                     return
                    MINX(FILTER(tbl,[Captured Date]>_date,[Captured Date]))
var tbl3=FILTER(ADDCOLUMNS(tbl2,"so ngay",[Ngay gan nhat]-[Captured Date]),[so ngay]>=3)
return  
IF(COUNTROWS(tbl2)>0,COUNTROWS(tbl3)+1)
 
Lần chỉnh sửa cuối:
Em viết đoạn này thì báo lỗi chỗ "var tbl3" là sao anh nhỉ?
View attachment 262374

So ngay dat hang_2 = var tbl = VALUES('DB Sales'[Captured Date]) var tbl2 = ADDCOLUMNS(tbl, "Ngay gan nhat", var _date=[Captured Date] return MINX(FILTER(tbl,[Captured Date]>_date,[Captured Date])) var tbl3=FILTER(ADDCOLUMNS(tbl2,"so ngay",[Ngay gan nhat]-[Captured Date]),[so ngay]>=3) return IF(COUNTROWS(tbl2)>0,COUNTROWS(tbl3)+1)
Thiếu dấu ngoặc sau _date ở dòng 7
 
Dựa vào file pibx tôi gửi trên, bạn viết thêm một measure như vầy, sửa khoảng cách các lần đặt hàng ở dấu mũi tên trong hình, hoặc tạo một disconnect table đưa slicer vào điều khiển tự động, đang cài chênh lệch 3 ngày (4/1 - 1/1 =3)View attachment 262371
Có thể tác động thẳng vào bảng số lượng khách hàng mua được không anh nhỉ?
Nó sẽ thay đổi liên quan đến lần mua hàng ạ.

Ví dụ với các công thức ban đầu thì khách mua ngày 1/1 rồi lại mua ngày 2/1 thì được xem là "lan 2" nhưng với việc bỏ qua các lần đặt hàng cách nhau dưới 4 ngày như trên thì phân loại lại sẽ tháng "lan 1" ở bảng số lượng khách đặt mua.

1626175310613.png
 
Có thể tác động thẳng vào bảng số lượng khách hàng mua được không anh nhỉ?
Nó sẽ thay đổi liên quan đến lần mua hàng ạ.

Ví dụ với các công thức ban đầu thì khách mua ngày 1/1 rồi lại mua ngày 2/1 thì được xem là "lan 2" nhưng với việc bỏ qua các lần đặt hàng cách nhau dưới 4 ngày như trên thì phân loại lại sẽ tháng "lan 1" ở bảng số lượng khách đặt mua.

View attachment 262375
Tôi chưa hiểu ý bạn nhỉ!
 
À chỉ cần thay "Số ngày đặt hàng" bởi "số ngày đặt hàng_2" trong measure "Số lượng khách đặt mua" .

Cảm ơn anh.
Bạn viết measure như vầy, nguyên tắc tính từ ngày đầu tiên khách hàng mua, cứ 4 ngày là 1 lần đặt, trong khoảng thời gian 4 ngày đó đặt bao nhiêu lần cũng chỉ tính 1 lần
Mã:
So ngay dat hang_2 =
var lan=MAX(Num[Value])
var tbl=ADDCOLUMNS(VALUES(Data_Test[Mã KH]),
            "So ngay dat hang",
                var tbl=CALCULATETABLE(SUMMARIZE(Data_Test,[Ngày đặt hàng]))
                var min_date=MINX(tbl,[Ngày đặt hàng])
                var tb2=ADDCOLUMNS(tbl,"Lan dat",
                            int(([Ngay dat hang]-min_date)/4))
                return
                    COUNTROWS(SUMMARIZE(tb2,[Lan dat])))
return
COUNTROWS(FILTER(tbl,[So ngay dat hang]=lan))
1626185606102.png
 
Bạn viết measure như vầy, nguyên tắc tính từ ngày đầu tiên khách hàng mua, cứ 4 ngày là 1 lần đặt, trong khoảng thời gian 4 ngày đó đặt bao nhiêu lần cũng chỉ tính 1 lần
Mã:
So ngay dat hang_2 =
var lan=MAX(Num[Value])
var tbl=ADDCOLUMNS(VALUES(Data_Test[Mã KH]),
            "So ngay dat hang",
                var tbl=CALCULATETABLE(SUMMARIZE(Data_Test,[Ngày đặt hàng]))
                var min_date=MINX(tbl,[Ngày đặt hàng])
                var tb2=ADDCOLUMNS(tbl,"Lan dat",
                            int(([Ngay dat hang]-min_date)/4))
                return
                    COUNTROWS(SUMMARIZE(tb2,[Lan dat])))
return
COUNTROWS(FILTER(tbl,[So ngay dat hang]=lan))
View attachment 262383
Cảm ơn anh.
Em đã so sánh 2 kết quả.
Với cách tính "thay "Số ngày đặt hàng" bởi "số ngày đặt hàng_2" trong measure "Số lượng khách đặt mua"" thì nếu khách đặt hàng liên tiếp từ ngày 1/1 đến ngày 18/1 thì được xem là đặt 1 lần do loại trừ liên tiếp các khoảng thời gian 3 ngày.

Với công thức anh gợi ý ở đây cho kết quả là khách đặt 5 lần, cách này đúng cái em đang cần để kiểm tra hơn.
1626189446811.png

Ngoài ra, em còn 1 câu hỏi nữa là cách measure này đều không thể có dòng "total" để tính tổng, như vậy:
- Nếu thêm total vào thì có thể thêm được không a?
- Nếu muốn thêm một cột là tỷ lẹ % của total, kết quả như hình sau thì có thể làm ngay trên measure được không a?
1626189846893.png


1626189638055.png
 
Web KT
Back
Top Bottom