Xin M-code Power query (3 người xem)

Người dùng đang xem chủ đề này

Tôi tuân thủ nội quy khi đăng bài

Người Miền Núi

Thành viên mới
Tham gia
16/5/26
Bài viết
12
Được thích
4
Em chào các Anh, em có file data, mong muốn của e là lấy dữ liệu ở dòng cuối cùng
ví dụ: Hoàng Thị Hỷ khám ở 2 khoa phòng, thì em muốn lấy thông tin khoa phòng khám cuối cùng, cụ thể là vào khám ở khoa khám bệnh phụ sản xong sang PK B202 theo yêu cầu thì chỉ lấy dữ liệu là phòng khám cuối cùng là PK B202 theo yêu cầu.
đối với Nguyễn Thùy Linh cũng tương tự.

Em rất mong nhận được hỗ trợ từ các Anh. Em cảm ơn các Anh nhiều ạ!
1784298733071.png
 

File đính kèm

Này thì xin M code

PHP:
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    Types = Table.TransformColumnTypes(Source,{{"STT", Int64.Type}, {"Năm sinh", Int64.Type}, {"Số lượng", Int64.Type}, {"Tổng tiền", Int64.Type}}),
    DateType = Table.TransformColumnTypes(Types, {{"Ngày chỉ định", type datetime},{"Ngày thực hiện", type datetime}}, "vi-VN"),
    AddMaxSTT = Table.AddColumn(DateType, "Max", each List.Max(Table.FindText(DateType,[Họ tên bệnh nhân])[STT]), type number),
    Filter = Table.SelectRows(AddMaxSTT, each ([Max] = [STT])),
    AddTotalQty = Table.AddColumn(Filter, "TotalQty", each List.Sum(Table.FindText(DateType, [Họ tên bệnh nhân])[Số lượng]), type number),
    AddTotalAmt = Table.AddColumn(AddTotalQty, "TotalAmount", each List.Sum(Table.FindText(DateType, [Họ tên bệnh nhân])[Tổng tiền]),type number),
    Result = Table.RemoveColumns(AddTotalAmt,{"Số lượng", "Tổng tiền"})
in
    Result
 
Tham khảo thêm giải pháp khác:
Mã:
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    // Group ten Benh nhan va chon dong cuoi
    Grouped = Table.Group(Source, {"Họ tên bệnh nhân"}, {{"LastRow", each Table.Last(_), type record}}),
    RemovedOtherColumns = Table.SelectColumns(Grouped,{"LastRow"}),
    ExpandedLastRow = Table.ExpandRecordColumn(RemovedOtherColumns, "LastRow",Table.ColumnNames(Source))
in
    ExpandedLastRow
 
Lần chỉnh sửa cuối:
Em chào các Anh, em có file data, mong muốn của e là lấy dữ liệu ở dòng cuối cùng
ví dụ: Hoàng Thị Hỷ khám ở 2 khoa phòng, thì em muốn lấy thông tin khoa phòng khám cuối cùng, cụ thể là vào khám ở khoa khám bệnh phụ sản xong sang PK B202 theo yêu cầu thì chỉ lấy dữ liệu là phòng khám cuối cùng là PK B202 theo yêu cầu.
đối với Nguyễn Thùy Linh cũng tương tự.

Em rất mong nhận được hỗ trợ từ các Anh. Em cảm ơn các Anh nhiều ạ!
View attachment 312091
dạ em cảm ơn anh nhiều ạ, code VBA của a rất hay ạ, tuy nhiên em muốn đưa vào Query để Merge với 1 data khác ạ
Bài đã được tự động gộp:

Này thì xin M code

PHP:
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    Types = Table.TransformColumnTypes(Source,{{"STT", Int64.Type}, {"Năm sinh", Int64.Type}, {"Số lượng", Int64.Type}, {"Tổng tiền", Int64.Type}}),
    DateType = Table.TransformColumnTypes(Types, {{"Ngày chỉ định", type datetime},{"Ngày thực hiện", type datetime}}, "vi-VN"),
    AddMaxSTT = Table.AddColumn(DateType, "Max", each List.Max(Table.FindText(DateType,[Họ tên bệnh nhân])[STT]), type number),
    Filter = Table.SelectRows(AddMaxSTT, each ([Max] = [STT])),
    AddTotalQty = Table.AddColumn(Filter, "TotalQty", each List.Sum(Table.FindText(DateType, [Họ tên bệnh nhân])[Số lượng]), type number),
    AddTotalAmt = Table.AddColumn(AddTotalQty, "TotalAmount", each List.Sum(Table.FindText(DateType, [Họ tên bệnh nhân])[Tổng tiền]),type number),
    Result = Table.RemoveColumns(AddTotalAmt,{"Số lượng", "Tổng tiền"})
in
    Result
dạ, em cảm ơn Anh ạ, em đang nghiên cứu áp dụng theo M-Code của Anh, em mới tìm hiểu về Power Query nên cũng chưa được thành thạo ạ, có gì em sẽ xin phép hỏi thêm các Anh ạ!
Bài đã được tự động gộp:

Tham khảo thêm giải pháp khác:
Mã:
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    // Group ten Benh nhan va chon dong cuoi
    Grouped = Table.Group(Source, {"Họ tên bệnh nhân"}, {{"LastRow", each Table.Last(_), type record}}),
    RemovedOtherColumns = Table.SelectColumns(Grouped,{"LastRow"}),
    ExpandedLastRow = Table.ExpandRecordColumn(RemovedOtherColumns, "LastRow",Table.ColumnNames(Source))
in
    ExpandedLastRow
dạ em cảm ơn Anh rất nhiều ạ, may mắn quá được các anh giúp đỡ, hqua em hỏi ông Chat GPT thì ổng bảo sort từ lớn đến bé rồi xóa trùng thì sẽ tự động lấy dòng đầu tiên, nhưng em làm theo thấy cũng chưa thực sự ổn lắm. em cảm ơn các Anh nhé, em chúc các Anh luôn dồi dào sức khỏe, hạnh phúc, thành đạt ạ.
 
Lần chỉnh sửa cuối:
let
Source = Folder.Files("D:\link"),
#"Added Custom" = Table.AddColumn(Source, "Custom", each Excel.Workbook([Content])),
#"Expanded Custom" = Table.ExpandTableColumn(#"Added Custom", "Custom", {"Name", "Data"}, {"Name.1", "Data"}),
#"Removed Other Columns" = Table.SelectColumns(#"Expanded Custom",{"Data"}),
#"Expanded Data" = Table.ExpandTableColumn(#"Removed Other Columns", "Data", {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7", "Column8", "Column9", "Column10", "Column11", "Column12", "Column13", "Column14", "Column15", "Column16", "Column17"}, {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7", "Column8", "Column9", "Column10", "Column11", "Column12", "Column13", "Column14", "Column15", "Column16", "Column17"}),
#"Removed Top Rows" = Table.Skip(#"Expanded Data",1),
#"Promoted Headers" = Table.PromoteHeaders(#"Removed Top Rows", [PromoteAllScalars=true]),
// Group ten Benh nhan va chon dong cuoi
Grouped = Table.Group(#"Promoted Headers", {"Họ tên bệnh nhân"}, {{"LastRow", each Table.Last(_), type record}}),
RemovedOtherColumns = Table.SelectColumns(Grouped,{"LastRow"}),
ExpandedLastRow = Table.ExpandRecordColumn(RemovedOtherColumns, "LastRow",Table.ColumnNames(#"Promoted Headers"))
in
ExpandedLastRow



em cảm ơn các Anh nhiều ạ, do file data e kết xuất từ phần mềm xuống nên đang mặc định không phải là table, e có chỉnh sửa 1 chút, do mới tìm hiểu Power query nên em chưa biết cách viết M-code để tối ưu được như các anh nên em cũng đang làm thủ công theo các bước, em sẽ dành thời gian nghiên cứu thêm, một lần nữa em cảm ơn các Anh rất rất nhiều ạ.

em chúc các Anh luôn mạnh khỏe, hạnh phúc, thành công, luôn nhiệt huyết giúp đỡ các em trong cộng đồng ạ
 
Rút gọn các bước cho dễ đọc :
Mã:
let
    // Tải tất cả các tệp Excel từ thư mục
    Source = Folder.Files("D:\link"),

    // Trích xuất nội dung workbook
    Workbooks = Table.AddColumn(Source, "Workbook", each Excel.Workbook([Content])),

    // Mở rộng để lấy dữ liệu sheet
    ExpandedWorkbooks = Table.ExpandTableColumn(Workbooks, "Workbook", {"Name", "Data"}, {"SheetName", "Data"}),

    // Giữ lại cột Data
    OnlyData = Table.SelectColumns(ExpandedWorkbooks, {"Data"}),

    // Mở rộng dữ liệu sheet thành các cột
    ExpandedData = Table.ExpandTableColumn(
        OnlyData,
        "Data",
        {"Column1","Column2","Column3","Column4","Column5","Column6","Column7","Column8","Column9","Column10","Column11","Column12","Column13","Column14","Column15","Column16","Column17"},
        {"Column1","Column2","Column3","Column4","Column5","Column6","Column7","Column8","Column9","Column10","Column11","Column12","Column13","Column14","Column15","Column16","Column17"}
    ),

    // Bỏ qua dòng tiêu đề
    SkipHeader = Table.Skip(ExpandedData, 1),

    // Đưa dòng đầu tiên lên làm tiêu đề
    PromotedHeaders = Table.PromoteHeaders(SkipHeader, [PromoteAllScalars=true]),

    // Nhóm theo tên bệnh nhân và lấy dòng cuối cùng
    Grouped = Table.Group(PromotedHeaders, {"Họ tên bệnh nhân"}, {{"LastRow", each Table.Last(_), type record}}),

    // Giữ lại kết quả đã nhóm
    LastRowOnly = Table.SelectColumns(Grouped, {"LastRow"}),

    // Mở rộng lại thành bảng đầy đủ
    FinalResult = Table.ExpandRecordColumn(LastRowOnly, "LastRow", Table.ColumnNames(PromotedHeaders))
in
    FinalResult
 
em cảm ơn các Anh nhiều ạ, do file data e kết xuất từ phần mềm xuống nên đang mặc định không phải là table, e có chỉnh sửa 1 chút,
1. Code này chưa tính tổng số lượng và thành tiền, không biết bạn có cần không.
2.Thư mục "D:\link" có 1 file hay nhiều file? Nếu chỉ 1 thì có thể làm gọn hơn, nếu nhiều thì dùng vòng lặp cũng gọn hơn.
 
Rút gọn các bước cho dễ đọc :
Mã:
let
    // Tải tất cả các tệp Excel từ thư mục
    Source = Folder.Files("D:\link"),

    // Trích xuất nội dung workbook
    Workbooks = Table.AddColumn(Source, "Workbook", each Excel.Workbook([Content])),

    // Mở rộng để lấy dữ liệu sheet
    ExpandedWorkbooks = Table.ExpandTableColumn(Workbooks, "Workbook", {"Name", "Data"}, {"SheetName", "Data"}),

    // Giữ lại cột Data
    OnlyData = Table.SelectColumns(ExpandedWorkbooks, {"Data"}),

    // Mở rộng dữ liệu sheet thành các cột
    ExpandedData = Table.ExpandTableColumn(
        OnlyData,
        "Data",
        {"Column1","Column2","Column3","Column4","Column5","Column6","Column7","Column8","Column9","Column10","Column11","Column12","Column13","Column14","Column15","Column16","Column17"},
        {"Column1","Column2","Column3","Column4","Column5","Column6","Column7","Column8","Column9","Column10","Column11","Column12","Column13","Column14","Column15","Column16","Column17"}
    ),

    // Bỏ qua dòng tiêu đề
    SkipHeader = Table.Skip(ExpandedData, 1),

    // Đưa dòng đầu tiên lên làm tiêu đề
    PromotedHeaders = Table.PromoteHeaders(SkipHeader, [PromoteAllScalars=true]),

    // Nhóm theo tên bệnh nhân và lấy dòng cuối cùng
    Grouped = Table.Group(PromotedHeaders, {"Họ tên bệnh nhân"}, {{"LastRow", each Table.Last(_), type record}}),

    // Giữ lại kết quả đã nhóm
    LastRowOnly = Table.SelectColumns(Grouped, {"LastRow"}),

    // Mở rộng lại thành bảng đầy đủ
    FinalResult = Table.ExpandRecordColumn(LastRowOnly, "LastRow", Table.ColumnNames(PromotedHeaders))
in
    FinalResult
dạ anh, em cảm ơn Anh nhé, Anh giải thích cụ thể từng dòng lệnh cho dễ hiểu như kia tốt quá rồi ạ, sau này gặp những bài toán tương tự thì e có thể vận dụng được vào để xử lý luôn.
Bài đã được tự động gộp:

1. Code này chưa tính tổng số lượng và thành tiền, không biết bạn có cần không.
2.Thư mục "D:\link" có 1 file hay nhiều file? Nếu chỉ 1 thì có thể làm gọn hơn, nếu nhiều thì dùng vòng lặp cũng gọn hơn.
dạ anh, hiện tại thì em chưa cần lấy tổng số lượng và tổng thành tiền, mục đích em muốn Merge data để lấy dữ liệu sang bên báo cáo khác, dạng như vlookup ạ. Thực sự là đọc các dòng M-code của các anh có những đoạn e chưa hiểu lắm do e mới tìm hiểu thôi, mang lên AI hỏi thì AI cũng phải đánh giá là đoạn code quá hay và ngắn gọn mà lại hiệu quả. chỉ tiếc là ng mới như e cần thêm thời gian mới ngấm được hihi
 
Tham khảo code dùng Group thay cho Table.FindText. Nếu cần tính tổng thì bỏ 2 dấu /* và */
PHP:
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    Types = Table.TransformColumnTypes(Source,
        {{"STT", Int64.Type}, {"Năm sinh", Int64.Type}, {"Số lượng", Int64.Type}, {"Tổng tiền", Int64.Type}}),
    DateType = Table.TransformColumnTypes(Types, {{"Ngày chỉ định", type datetime},{"Ngày thực hiện", type datetime}}, "vi-VN"),
    Grouped = Table.Group(DateType, {"Họ tên bệnh nhân"},
        {
            {"MaxSTT", each List.Max([STT]), Int64.Type},
            /*{"TotalQty", each List.Sum([Số lượng]), Int64.Type},
            {"TotalAmount", each List.Sum([Tổng tiền]), Int64.Type},*/
            {"LastRow", each Table.LastN(_, 1), type table }}),
    Expand = Table.ExpandTableColumn(Grouped, "LastRow", {"Tên dịch vụ", "Bác sỹ chỉ định", "Mã KB/Mã VV", "Năm sinh", "Giới tính", "Địa chỉ", "Đối tượng", "Mã thẻ BHYT", "Ngày chỉ định", "Ngày thực hiện", "Khoa/phòng thực hiện", "Số lượng", "Tổng tiền"})
in
    Expand
 
Tham khảo code dùng Group thay cho Table.FindText. Nếu cần tính tổng thì bỏ 2 dấu /* và */
PHP:
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    Types = Table.TransformColumnTypes(Source,
        {{"STT", Int64.Type}, {"Năm sinh", Int64.Type}, {"Số lượng", Int64.Type}, {"Tổng tiền", Int64.Type}}),
    DateType = Table.TransformColumnTypes(Types, {{"Ngày chỉ định", type datetime},{"Ngày thực hiện", type datetime}}, "vi-VN"),
    Grouped = Table.Group(DateType, {"Họ tên bệnh nhân"},
        {
            {"MaxSTT", each List.Max([STT]), Int64.Type},
            /*{"TotalQty", each List.Sum([Số lượng]), Int64.Type},
            {"TotalAmount", each List.Sum([Tổng tiền]), Int64.Type},*/
            {"LastRow", each Table.LastN(_, 1), type table }}),
    Expand = Table.ExpandTableColumn(Grouped, "LastRow", {"Tên dịch vụ", "Bác sỹ chỉ định", "Mã KB/Mã VV", "Năm sinh", "Giới tính", "Địa chỉ", "Đối tượng", "Mã thẻ BHYT", "Ngày chỉ định", "Ngày thực hiện", "Khoa/phòng thực hiện", "Số lượng", "Tổng tiền"})
in
    Expand
dạ Anh, em cảm ơn Anh nhiều ạ, em sẽ nghiên cứu thêm ạ.
 
View attachment 312107
Học cách sử dụng Power Pivot thì sẽ nhanh hơn nhiều Power Query đó bạn!
wow, cảm ơn bạn nhiều nhen, 1 kỹ năng mới cần học hỏi, căn bản là mình dùng query để kết hợp được nhiều file lại với nhau thấy hiệu quả, đặc biệt là data nhiều dữ liệu nếu sử dụng công thức thì đơ máy luôn nhưng query xử lý rất mượt, mình cũng nghe qua pivot nhưng chưa tìm hiểu, mới chỉ dùng lại ở pivot table đơn giản bên ngoài thôi
 
wow, cảm ơn bạn nhiều nhen, 1 kỹ năng mới cần học hỏi, căn bản là mình dùng query để kết hợp được nhiều file lại với nhau thấy hiệu quả, đặc biệt là data nhiều dữ liệu nếu sử dụng công thức thì đơ máy luôn nhưng query xử lý rất mượt, mình cũng nghe qua pivot nhưng chưa tìm hiểu, mới chỉ dùng lại ở pivot table đơn giản bên ngoài thôi
Có thể bạn chưa tiếp xúc nhiều với Power Query, PowerPivot nên chưa rõ nhiệm vụ chính của 2 thứ này:
Power query nhiệm vụ chính là ETL dữ liệu, còn Power Pivot nhiệm vụ chính của nó là phân tích, bạn cần phân tích tìm cái gì đó thì cần dùng Power Pivot.
Tôi không nói là Power Query không làm được:
JavaScript:
let
    Source = Table.PromoteHeaders(Excel.Workbook(File.Contents("C:\Users\Windows\Downloads\2.Sổ chi tiết DVCLS trong bảng kê (1).xlsx"), null, true){0}[Data], [PromoteAllScalars=true]),
    ChangedType = Table.TransformColumnTypes(Source, {{"Ngày thực hiện", type datetime}}),
    Grouped = Table.Group(ChangedType, {"Mã KB/Mã VV"}, {{"Dichvucuoi", each Table.Max(_, "Ngày thực hiện")}}),
    Result = Table.FromRecords(Grouped[Dichvucuoi])
in
    Result
Khi bạn làm ở một bài toán lớn hơn, cần dùng data model , kết hợp giữa các bảng dữ liệu bạn mới thấy được tại sao phải dùng nhiệm vụ chính của từng cái.
 
Có thể bạn chưa tiếp xúc nhiều với Power Query, PowerPivot nên chưa rõ nhiệm vụ chính của 2 thứ này:
Power query nhiệm vụ chính là ETL dữ liệu, còn Power Pivot nhiệm vụ chính của nó là phân tích, bạn cần phân tích tìm cái gì đó thì cần dùng Power Pivot.
Tôi không nói là Power Query không làm được:
JavaScript:
let
    Source = Table.PromoteHeaders(Excel.Workbook(File.Contents("C:\Users\Windows\Downloads\2.Sổ chi tiết DVCLS trong bảng kê (1).xlsx"), null, true){0}[Data], [PromoteAllScalars=true]),
    ChangedType = Table.TransformColumnTypes(Source, {{"Ngày thực hiện", type datetime}}),
    Grouped = Table.Group(ChangedType, {"Mã KB/Mã VV"}, {{"Dichvucuoi", each Table.Max(_, "Ngày thực hiện")}}),
    Result = Table.FromRecords(Grouped[Dichvucuoi])
in
    Result
Khi bạn làm ở một bài toán lớn hơn, cần dùng data model , kết hợp giữa các bảng dữ liệu bạn mới thấy được tại sao phải dùng nhiệm vụ chính của từng cái.
đúng rồi, mình mới tìm hiểu nên cũng chưa nắm được chức năng nhiệm vụ của từng mảng, cảm ơn bạn rất nhiều nhé, mình sẽ dành thêm thời gian để nghiên cứu, có j vướng mắc nhờ b hướng dẫn, giúp đỡ mình thêm với nhé ^^
 
đúng rồi, mình mới tìm hiểu nên cũng chưa nắm được chức năng nhiệm vụ của từng mảng, cảm ơn bạn rất nhiều nhé, mình sẽ dành thêm thời gian để nghiên cứu, có j vướng mắc nhờ b hướng dẫn, giúp đỡ mình thêm với nhé ^^
Thực ra bây giờ có AI rồi, hỏi nó là được thôi, quan trọng là phải biết hỏi sao cho đúng ý, học cách hỏi, Prompt quan trọng hơn, cần hỏi gì cứ hỏi, mọi người sẽ giúp bạn. Có thể tìm hiểu bài viết về Power Pivot từ thành viên excel_lv1.5 và một số bài viết của tôi nick tranhungdao12a3, dạo này tôi cũng hơi lười viết!
 

Bài viết mới nhất

Back
Top Bottom