Saya memiliki meja di mana setiap orang memiliki catatan untuk setiap hari sepanjang tahun. Saya menggunakan fungsi ini untuk mencapai total berjalan berdasarkan kolom saldo harian
CALCULATE(
SUM(Leave[Daily Balance]),
FILTER(
ALLEXCEPT(Leave, Leave[Employee Id]),
Leave[Date] <= EARLIER(Leave[Date])
))
tapi saya perlu total menjalankan untuk memulai kembali dari 1 jika Jenis = Bekerja DAN total menjalankan Saldo Harian kurang dari nol DAN Jenis baris sebelumnya tidak sama dengan Bekerja. Di bawah ini adalah cuplikan layar dari Excel. Kolom fungsi yang diperlukan adalah apa yang saya butuhkan.
powerbi
dax
powerbi-desktop
LynseyC
sumber
sumber
Jawaban:
Ini bukan hanya total berjalan dengan kondisi, tetapi juga yang bersarang / berkerumun, karena logika harus diterapkan pada level ID. Untuk tabel besar, M lebih baik daripada DAX, karena tidak menggunakan banyak RAM. (Saya sudah membuat blog tentang hal itu di sini: Tautan ke Blogpost
Fungsi berikut menyesuaikan logika itu dengan kasus saat ini dan harus diterapkan pada level ID: (Nama kolom yang diperlukan adalah: "Tipe", "Tunjangan Harian", "Penyesuaian")
(MyTable as table) => let SelectJustWhatsNeeded = Table.SelectColumns(MyTable,{"Type", "Daily Allowance", "Adjustments"}), ReplaceNulls = Table.ReplaceValue(SelectJustWhatsNeeded,null,0,Replacer.ReplaceValue,{"Adjustments"}), #"Merged Columns" = Table.CombineColumns(ReplaceNulls,{"Daily Allowance", "Adjustments"}, List.Sum,"Amount"), TransformToList = List.Buffer(Table.ToRecords(#"Merged Columns")), ConditionalRunningTotal = List.Skip(List.Generate( () => [Type = TransformToList{0}[Type], Result = 0, Counter = 0], each [Counter] <= List.Count(TransformToList), each [ Result = if TransformToList{[Counter]}[Type] = "working" and [Result] < 0 and [Type] <> "working" then TransformToList{[Counter]}[Amount] else TransformToList{[Counter]}[Amount] + [Result] , Type = TransformToList{[Counter]}[Type], Counter = [Counter] + 1 ], each [Result] )), Custom1 = Table.FromColumns( Table.ToColumns(MyTable) & {ConditionalRunningTotal}, Table.ColumnNames(MyTable) & {"Result"} ) in Custom1
sumber
Gambaran
Ini adalah hal yang menantang untuk diminta PowerBI lakukan, sehingga pendekatan yang rapi mungkin sulit ditemukan.
Masalah terbesar adalah bahwa model data PowerBI tidak mendukung konsep penghitungan berjalan - setidaknya bukan cara kita melakukannya di Excel. Di Excel, sebuah kolom bisa mereferensikan nilai yang terjadi di 'baris sebelumnya' pada kolom yang sama dan kemudian disesuaikan dengan beberapa 'perubahan harian' yang terdaftar di kolom yang berbeda.
PowerBI hanya bisa meniru ini dengan menambahkan semua perubahan harian pada beberapa bagian baris. Kami mengambil nilai tanggal di baris kami saat ini dan membuat tabel yang difilter di mana semua tanggal kurang dari tanggal baris ini, dan kemudian menjumlahkan semua perubahan harian dari subset tersebut. Ini mungkin tampak perbedaan yang halus, tetapi cukup signifikan:
Ini berarti bahwa tidak ada cara untuk 'mengganti' total lari kami. Satu-satunya matematika yang sedang dilakukan adalah terjadi pada kolom yang berisi perubahan harian - kolom yang berisi 'total berjalan' hanyalah hasil - itu tidak pernah digunakan dalam perhitungan baris berikutnya.
Kita harus meninggalkan konsep 'reset' dan malah membayangkan membuat kolom yang berisi nilai 'penyesuaian'. Penyesuaian kami akan menjadi nilai yang dapat dimasukkan sehingga ketika kondisi yang dijelaskan dipenuhi, total saldo dan penyesuaian harian akan berjumlah 1.
Jika kita melihat running yang dihitung yang diberikan oleh OP, kita melihat bahwa nilai total running kita pada hari 'non-kerja' tepat sebelum hari 'bekerja' memberi kita jumlah yang dibutuhkan itu, jika dibalik, akan berjumlah nol dan menyebabkan total berjalan pada setiap hari kerja berikutnya bertambah satu. Ini adalah perilaku yang kita inginkan (dengan satu masalah yang akan dijelaskan nanti).
Hasil
Ini membantu untuk mengetahui perbedaan antara konteks baris dan filter dan bagaimana EARLIER beroperasi untuk mengikuti perhitungan ini. Dalam skenario ini, Anda dapat menganggap "EARLIER" sebagai yang berarti 'referensi ini menunjuk ke nilai di baris saat ini "dan sebaliknya sebuah referensi menunjuk ke seluruh tabel yang dikembalikan oleh" ALLEXCEPT (Leave, Leave [Id]). " cara, kami menemukan tempat-tempat di mana baris saat ini memiliki tipe "Bekerja" dan baris hari sebelumnya memiliki beberapa jenis lainnya.
Perhitungan ini meniru jenis operasi 'isi'. Dikatakan, "Ketika melihat semua baris yang tanggalnya sebelum tanggal pada baris INI, kembalikan nilai terbesar dalam 'Tanggal Terbaru Sebelum Bekerja."
Sekarang setiap baris memiliki bidang yang menjelaskan ke mana harus mencari saldo harian untuk digunakan sebagai penyesuaian kami, kita bisa mencarinya dari tabel.
Dan akhirnya kami menerapkan penyesuaian pada total berjalan kami untuk hasil akhir.
Masalah
Pendekatan ini gagal menunjukkan bahwa penghitungan tidak boleh direset kecuali saldo harian berjalan di bawah nol. Saya telah terbukti salah sebelumnya, tetapi saya akan mengatakan bahwa ini tidak dapat diselesaikan dalam DAX saja karena itu menciptakan ketergantungan melingkar. Pada dasarnya, Anda membuat persyaratan: gunakan nilai agregat untuk menentukan apa yang harus dimasukkan dalam agregasi.
Jadi sejauh yang bisa saya bawa. Semoga ini bisa membantu.
sumber
Semoga lain kali Anda akan menempelkan csv atau kode yang menghasilkan data sampel, bukan gambar. :)
Biarkan saya menyarankan Anda melakukan perhitungan di PowerQuery saja. Saya mencoba memecah kode untuk beberapa langkah untuk meningkatkan keterbacaan. Ini mungkin terlihat sedikit lebih rumit, namun bekerja dengan baik. Cukup tempel di editor tingkat lanjut dan ganti sumber dengan data sumber Anda. Semoga berhasil!
sumber
Saya rasa saya memilikinya!
Inilah hasilnya, membangun solusi yang saya posting sebelumnya: (Data telah dimodifikasi untuk memamerkan lebih banyak perilaku "bekerja / tidak bekerja" dan menggunakan kasus)
HASIL
RINCIAN
(1) Drop Kolum "Saldo Harian Disesuaikan" dan "Penyesuaian Saldo Harian". Kami akan mendapatkan hasil yang sama dengan satu langkah lebih sedikit hanya dalam beberapa saat.
(2) Buat kolom berikut (RDB = "saldo harian berjalan") ...
Setelah membuat "Tanggal Terkini Sebelum Bekerja Selesai," kami sebenarnya memiliki bagian yang diperlukan untuk melakukan 'reset' yang saya klaim tidak mungkin dilakukan sebelumnya. Dengan memfilter pada bidang ini, kami memiliki kesempatan untuk memulai setiap irisan di '1'
(3) Kami masih memiliki masalah yang sama, kami tidak dapat melihat hasilnya di kolom kami dan menggunakannya untuk memutuskan apa yang harus dilakukan nanti di kolom yang sama. Tapi kami BISA membangun kolom penyesuaian baru yang akan menampung info itu! Dan kami sudah memiliki referensi ke 'Tanggal Terbaru Sebelum Bekerja' - itu adalah hari terakhir di grup sebelumnya ... baris dengan informasi yang kami butuhkan!
Jadi kami melihat hari terakhir di Setiap grup sebelumnya dan jika jumlah total penyesuaian tersebut memiliki nilai positif, kami menerapkannya dan jika negatif kami membiarkannya saja. Juga, jika beberapa hari pertama orang kami adalah hari yang tidak bekerja, kami sama sekali tidak ingin hal negatif awal dalam penyesuaian kami sehingga bisa disaring juga.
(4) Langkah terakhir ini akan membawa penyesuaian ke hasil akhir. Ringkas dua kolom baru dan akhirnya kita harus memiliki Saldo Harian Berjalan Disesuaikan. Voila!
Kami membuat banyak kolom tambahan di sepanjang jalan menuju hasil ini yang biasanya bukan hal favorit saya untuk dilakukan. Tapi, ini rumit.
sumber
Butuh waktu beberapa saat, tetapi saya bisa menemukan solusi. Dengan asumsi, nilai saldo untuk kosong selalu -1 dan nilainya 1 untuk "Bekerja" dan bahwa data tersedia untuk semua tanggal tanpa celah, sesuatu seperti perhitungan di bawah ini bisa berfungsi:
Perlu diingat, ini mungkin bukan produk jadi karena saya bekerja dengan sampel kecil, tetapi ini harus Anda mulai. Semoga ini membantu.
sumber
Perhitungannya agak panjang, tetapi tampaknya berfungsi dalam data sampel yang saya gunakan. Cobalah ini:
Saya telah menggunakan banyak variabel di sini. Anda mungkin dapat membuat versi yang lebih pendek. Pada dasarnya idenya adalah untuk menemukan kemunculan pertama "Bekerja" untuk menemukan dari mana memulai perhitungan. Ini dihitung dalam variabel "Prev_Blank2". Setelah kita tahu titik awalnya (dimulai dengan 1 di sini), maka kita cukup menghitung jumlah hari dengan "Bekerja" atau kosong () di antara Prev_Blank2 dan tanggal catatan saat ini. Dengan menggunakan hari-hari ini, kami dapat mengembalikan nilai akhir untuk menjalankan total.
Semoga ini berhasil;)
sumber