পাওয়ার বিআই ডেস্কটপ ডএএক্স পুনঃসূচনা মোট কলাম চলছে


9

আমার একটি টেবিল রয়েছে যেখানে প্রতিটি ব্যক্তির বছরের বছরের প্রতিটি দিনের রেকর্ড থাকে। আমি দৈনিক ব্যালেন্স কলামের উপর ভিত্তি করে চলমান মোট অর্জনের জন্য এই ফাংশনটি ব্যবহার করেছি

CALCULATE(
SUM(Leave[Daily Balance]),
FILTER(
   ALLEXCEPT(Leave, Leave[Employee Id]),
   Leave[Date] <= EARLIER(Leave[Date])
))

তবে টাইপ = ওয়ার্কিং এবং চলমান মোট দৈনিক ব্যালেন্স শূন্যের চেয়ে কম এবং পূর্ববর্তী সারির প্রকারটি কার্যকারণের সমান নয়, তবে আমার রানিং টোটালটি 1 থেকে পুনরায় শুরু করতে হবে। নীচে এক্সেল থেকে একটি স্ক্রিন শট দেওয়া আছে। প্রয়োজনীয় ফাংশন কলামটি আমার যা করা দরকার।

এখানে চিত্র বর্ণনা লিখুন


1
5 নভেম্বর, ব্যক্তি 1-এর সারিতে, ধরুন আমাদের পরীক্ষার ডেটা ফাঁকা রয়েছে। 'প্রয়োজনীয় ফাংশন' 6 নভেম্বর 1 বা 2 ফেরত দেবে?
রায়ান বি

এটি নভেম্বরের জন্য ২ আসবে। নভেম্বর "রিসেট" ঘটবে না কারণ 5 নভেম্বর হবে 1 (নেতিবাচক সংখ্যা নয়)। আপনার বিস্তারিত পোস্টের জন্য ধন্যবাদ। আমি আজ পর্যালোচনা করছি
LynseyC

উত্তর:


1

এটি কেবল একটি শর্ত সহ চলমান মোট নয়, যুক্তিটি আইডি-স্তরে প্রয়োগ করতে হওয়ায় এটি একটি নেস্টেড / ক্লাস্টারযুক্তও রয়েছে। বড় টেবিলগুলির জন্য, এমএক্স এ DAX এর চেয়ে ভাল, কারণ এটি যতটা র‍্যাম ব্যবহার করে না। (আমি এখানে ব্লগ করেছি: ব্লগপোস্টের লিঙ্ক

নিম্নলিখিত ফাংশনটি বর্তমান ক্ষেত্রে এই যুক্তিকে অভিযোজিত এবং আইডি-স্তরে প্রয়োগ করতে হবে: (প্রয়োজনীয় কলামের নামগুলি হ'ল: "প্রকার", "দৈনিক ভাতা", "সামঞ্জস্য")

(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


এটি সমস্যার সমাধান করেছে। নিখুঁতভাবে কাজ করে এবং রিপোর্টটি কমিয়ে দেয় না। ধন্যবাদ
LynseyC

5

সংক্ষিপ্ত বিবরণ

পাওয়ারবিআইয়ের কাছে এটি জিজ্ঞাসা করা একটি চ্যালেঞ্জিং কাজ, তাই পরিপাটি করার পদ্ধতিটি খুঁজে পাওয়া মুশকিল।

সবচেয়ে বড় সমস্যাটি হ'ল পাওয়ারআইবিআইয়ের ডেটা মডেল চলমান টেলির ধারণাকে সমর্থন করে না - আমরা এক্সেলে এটি করি না কেন। এক্সেলে, একটি কলাম সেই মানগুলির রেফারেন্স দিতে পারে যা একই কলামের 'পূর্ববর্তী সারিতে' দেখা যায় এবং তারপরে আলাদা কলামে তালিকাভুক্ত কিছু 'দৈনিক পরিবর্তন' দ্বারা সামঞ্জস্য হয়।

পাওয়ার বিবিআই কেবলমাত্র সারিগুলির কিছু উপসেটের মধ্যে সমস্ত দৈনিক পরিবর্তনগুলি যোগ করে এটি অনুকরণ করতে পারে। আমরা আমাদের বর্তমান সারিতে তারিখের মানটি নিয়েছি এবং একটি ফিল্টারযুক্ত টেবিল তৈরি করি যেখানে সমস্ত তারিখ বর্তমান সারিটির তারিখের চেয়ে কম থাকে এবং তারপরে সেই উপসেট থেকে সমস্ত দৈনিক পরিবর্তনগুলি সংমিশ্রণ করি। এটি একটি সূক্ষ্ম পার্থক্য বলে মনে হতে পারে, তবে এটি বেশ তাৎপর্যপূর্ণ:

এর অর্থ হ'ল আমাদের চলমান মোট 'ওভাররাইড' করার কোনও উপায় নেই। একমাত্র গণিত যা করা হচ্ছে প্রতিদিনের পরিবর্তনগুলি সহ কলামে ঘটে চলেছে - 'চলমান মোট' ধারণকারী কলামটি কেবল একটি ফলাফল - এটি পরবর্তী কোনও সারির গণনায় কখনও ব্যবহৃত হয় না।

আমাদের অবশ্যই 'রিসেট' ধারণাটি ত্যাগ করতে হবে এবং এর পরিবর্তে একটি কলাম তৈরি করার কল্পনা করতে হবে যাতে একটি 'সমন্বয়' মান রয়েছে। আমাদের সমন্বয় এমন একটি মান হবে যা অন্তর্ভুক্ত করা যেতে পারে যাতে বর্ণিত শর্তগুলি যখন পূরণ করা হয়, মোট দৈনিক ব্যালেন্স এবং সমন্বয়গুলি মোট 1 হয়ে যায়।

যদি আমরা ওপি কর্তৃক প্রদত্ত গণনা করা চালনার দিকে নজর রাখি তবে আমরা দেখতে পাই যে 'কার্যকরী' দিনের ঠিক আগে 'অ-কার্যকরী' দিনে আমাদের চলমান মোটের মান আমাদের প্রয়োজনীয় পরিমাণ দেয় যা বিপরীত হলে শূন্য হয় এবং নিম্নলিখিত প্রতিটি কার্যদিবসে চলমান মোট এক এক করে বাড়িয়ে দিন। এটি আমাদের কাঙ্ক্ষিত আচরণ (একটি সমস্যা যা পরে বর্ণিত হবে)।

ফলাফল

এখানে চিত্র বর্ণনা লিখুন

Most Recent Date Prior to Work = 

CALCULATE(
Max(Leave[Date]),
FILTER(
   ALLEXCEPT(Leave, Leave[Id]),
   Leave[Date] = EARLIER(Leave[Date]) -1 && Leave[Type] <> "Working" && Earlier(Leave[Type]) = "Working"
))

এটি সারি এবং ফিল্টার প্রসঙ্গের মধ্যে পার্থক্য এবং এই গণনাটি অনুসরণ করতে EARLIER কীভাবে পরিচালনা করে তা জানতে সহায়তা করে। এই পরিস্থিতিতে আপনি "EARLIER" এর অর্থ 'বর্তমান সারির মানটিকে এই রেফারেন্সটি নির্দেশ করে "হিসাবে ভাবতে পারেন এবং অন্যথায় পুরো টেবিলের জন্য একটি রেফারেন্স" ALLEXCEPT (ছেড়ে দিন, ছেড়ে দিন [আইডি]) ফিরে এসেছে। "এতে উপায়, আমরা বর্তমান সারিটিতে "ওয়ার্কিং" টাইপ এবং পূর্ববর্তী দিনের সারিতে কিছু অন্য ধরণের স্থান রয়েছে আমরা সন্ধান করি।

Most Recent Date Prior to Work Complete = 

CALCULATE(
Max(Leave[Most Recent Date Prior to Work]),
FILTER(
   ALLEXCEPT(Leave, Leave[Id]),
   Leave[Date] <= EARLIER(Leave[Date])
))

এই গণনাটি 'ফিল ডাউন' ধরণের অপারেশনের অনুকরণ করে। এতে বলা হয়েছে, "এই সারিটির তারিখের আগের তারিখের সমস্ত সারিটি দেখার সময়, 'কাজের পূর্বে অতি সাম্প্রতিক তারিখের বৃহত্তম মানটি ফিরিয়ে দিন।"

Daily Balance Adjustment = 

CALCULATE(
SUM(Leave[Running Daily Balance]),
FILTER(
   ALLEXCEPT(Leave, Leave[Id]),
   Leave[Date] = EARLIER(Leave[Most Recent Date Prior to Work Complete])
))

এখন প্রতিটি সারিটির একটি ক্ষেত্র রয়েছে যেখানে আমাদের সামঞ্জস্য হিসাবে প্রতিদিনের ব্যালেন্সটি খুঁজে পেতে কোথায় যেতে হবে তা ব্যাখ্যা করে, আমরা কেবল এটি টেবিল থেকে উপরে দেখতে পারি।

Adjusted Daily Balance = Leave[Running Daily Balance] - Leave[Daily Balance Adjustment]

এবং পরিশেষে আমরা চূড়ান্ত ফলাফলের জন্য আমাদের চলমান মোটের সমন্বয় প্রয়োগ করি।

সমস্যাটি

এই পদ্ধতির ঠিকানাটি ব্যর্থ হয়েছে যে চলমান দৈনিক ভারসাম্য শূন্যের নীচে না থাকলে গণনাটি পুনরায় সেট করা উচিত নয়। আমি এর আগেও ভুল প্রমাণিত হয়েছি, তবে আমি বলব যে এটি কেবলমাত্র ডেক্সেই সম্পন্ন করা যায় না কারণ এটি একটি বিজ্ঞপ্তি নির্ভরতা তৈরি করে। মূলত, আপনি একটি প্রয়োজনীয়তা তৈরি করেছেন: সমষ্টিতে কী অন্তর্ভুক্ত করা উচিত তা নির্ধারণের জন্য সমষ্টিগত মানটি ব্যবহার করুন।

তাই আমি আপনাকে এনে দিতে পারি আশা করি এটা সাহায্য করবে.


1
আপনার শেষ পয়েন্টটি সম্পর্কে, আমি বিশ্বাস করি আপনি সঠিক আছেন। ড্যাক্স পুনরাবৃত্তি করতে পারে না।
অ্যালেক্সিস ওলসন

3

আশা করি পরের বার আপনি এমন কোনও সিএসভি বা কোড পেস্ট করবেন যা ছবির পরিবর্তে নমুনা ডেটা তৈরি করে। :)

এর পরিবর্তে আপনি কেবল আপনার ক্যালকুলেশনগুলি পাওয়ার কুইচারিতে করার পরামর্শ দিন। আমি পঠনযোগ্যতা উন্নত করতে কয়েকটি পদক্ষেপের জন্য কোড বিভক্ত করার চেষ্টা করেছি। এটি কিছুটা জটিল দেখায়, তবে এটি ভালভাবে কাজ করে। এটি কেবল উন্নত সম্পাদকে পেস্ট করুন এবং তারপরে উত্সটি আপনার উত্স ডেটার সাথে প্রতিস্থাপন করুন। শুভকামনা করছি!

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjDUMzDSMzIwtFTSUQpILSrOz1MwBDLL84uyM/PSlWJ1gGqMsKuBSBrjkzQhwnRTItSYEaHGHJ9DLPBJWhI23dAAjwGGOAIRIokj9OCmxwIA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [date = _t, name = _t, #"type" = _t]),
    SetTypes = Table.TransformColumnTypes(Source,{{"date", type date}, {"name", type text}, {"type", type text}}),
    TempColumn1 = Table.AddColumn(SetTypes, "LastOtherType", (row)=>List.Max(Table.SelectRows(SetTypes, each ([name] = row[name] and [type] <> row[type] and [date] <= row[date]))[date], row[date]), type date) //Here for each row we select all rows of other type with earlier date, and take max that date. Thus we know when was previous change from one type to another
 //Here for each row we select all rows of other type with earlier date, and take max that date. Thus we know when was previous change from one type to another
,
    TempColumn2 = Table.AddColumn(TempColumn1, "Count", (row)=>
(if row[type]="working" then 1 else -1) * 
Table.RowCount(
Table.SelectRows(SetTypes, each ([name] = row[name] and [type] = row[type] and [date] <= row[date] and [date] > row[LastOtherType])) /* select all rows between type change (see prev step) and current row */
), /*and count them*/
Int64.Type) // finally multiply -1 if they are not working type
,
    FinalColumn = Table.AddColumn(TempColumn2, "FinalFormula", (row)=> 
(if row[type] = "working" then row[Count] else /* for working days use Count, for others take prev max Count and add current Count, which is negative for non-working*/
Table.LastN(Table.SelectRows(TempColumn2, each [name] = row[name] and [type] = "working" and [LastOtherType] <= row[LastOtherType]),1)[Count]{0}
+ row[Count])
, Int64.Type),
    RemovedTempColumns = Table.RemoveColumns(FinalColumn,{"LastOtherType", "Count"})
in
    RemovedTempColumns

আমি নিশ্চিত নই যে এটি প্রতিটি দৃশ্যের অন্তর্ভুক্ত, তবে এটি সঠিক পদ্ধতির মতো বলে মনে হচ্ছে।
মাইক মধু

আমি কেবল তখনই এটি কাজ করতে পারি যদি প্রতিটি ব্যক্তির জন্য প্রথম ধরণের কাজ করা হয়। এছাড়াও ডএএক্স উদাহরণগুলির সাথে এটি পূর্ববর্তী সারির মোট সংখ্যক ধনাত্মক সংখ্যা হলে কার্যকারী আন্দোলনের জন্য নম্বরটি পুনরায় সূচনা করে। আমি অনুমান করি যে আমার ছবিটি বিভ্রান্তিকর হয়েছিল কারণ এটিতে কেবল এই দৃশ্যটি রয়েছে। আমার একটি সময় অন্তর্ভুক্ত করা উচিত ছিল যখন টাইপটি কাজ করে পরিবর্তিত হয়েছিল তবে পূর্ববর্তী সারির মোটটি ইতিবাচক ছিল।
LynseyC

@ লিন্যাসিক ভাল, এই কোডটি অবশ্যই নিখুঁত এবং সম্পূর্ণ সমাধান নয়, বরং এটি ব্যবহার করা যেতে পারে এমন পদ্ধতির উদাহরণ। আপনার দৃশ্যের জন্য যদি কেবল পরিবর্তন করুন।
ইউজিন

@ লিন্সেকও, ডিএএক্সের চেয়ে পাওয়ারকুয়ারিতে এই গণিতটি করার সুবিধার মধ্যে একটি হ'ল টেম্প কলামগুলি ডেটা মডেল থেকে দূরে রাখার একটি সহজ উপায়।
ইউজিন

3

আমার মনে হয় এটা আছে!

ফলাফলটি এখানে, আমি আগে পোস্ট করা সমাধানের উপর ভিত্তি করে তৈরি করেছি: (আরও "কাজ / কোনও কাজ নয়" আচরণগুলি ব্যবহার এবং কেসগুলি ব্যবহার করার জন্য ডেটা সংশোধন করা হয়েছে)

ফলাফল

এখানে চিত্র বর্ণনা লিখুন

বিশদ বিবরণ

(1) "অ্যাডজাস্টেড রানিং ডেইলি ব্যালেন্স" এবং "ডেইলি ব্যালান্স অ্যাডজাস্টমেন্ট" কলামস ফেলে দিন। আমরা মাত্র এক মুহুর্তে আরও একটি পদক্ষেপ নিয়ে একই ফলাফল পাব।

(২) নিম্নলিখিত কলামটি তৈরি করুন (আরডিবি = "চলমান দৈনিক ভারসাম্য") ...

Grouped RDB = 

CALCULATE(
SUM(Leave[Daily Balance]),
FILTER(
   ALLEXCEPT(Leave, Leave[Id], Leave[Most Recent Date Prior to Work Complete]),
   Leave[Date] <= EARLIER(Leave[Date]) 
))

"কাজ শেষ হওয়ার আগে অতি সাম্প্রতিক তারিখ" তৈরি করার পরে, আমরা দাবি করেছি যে আমাদের 'রিসেট' করার জন্য প্রয়োজনীয় অংশটি আমার দাবি ছিল যা আগে অসম্ভব ছিল। এই ক্ষেত্রটি ফিল্টার করে, আমাদের প্রতিটি ফালি '1' এ শুরু করার সুযোগ রয়েছে

(3) আমাদের এখনও একই সমস্যা রয়েছে, আমরা আমাদের কলামে ফলাফলটি দেখতে পারি না এবং পরে একই কলামে কী করব তা সিদ্ধান্ত নিতে এটি ব্যবহার করতে পারি না। তবে আমরা একটি নতুন সমন্বয় কলাম তৈরি করতে পারি যা সেই তথ্যটি ধারণ করবে! এবং আমাদের কাছে ইতিমধ্যে 'কাজের পূর্বে সাম্প্রতিক তারিখের' একটি রেফারেন্স রয়েছে - এটি পূর্ববর্তী গ্রুপের শেষ দিন ... আমাদের প্রয়োজনীয় তথ্য সহ সারি!

Grouped RDB Adjustment = 

VAR CalculatedAdjustment =
CALCULATE(
SUM(Leave[Grouped RDB]),
FILTER(
   ALLEXCEPT(Leave, Leave[Id]),
   Leave[Date] IN SELECTCOLUMNS(
        FILTER(
            Leave,
            Leave[Most Recent Date Prior to Work] <> BLANK() &&
            Leave[id] = EARLIER(Leave[Id])), "MRDPtW", Leave[Most Recent Date Prior to Work]) &&
   Leave[Most Recent Date Prior to Work Complete] < EARLIER(Leave[Most Recent Date Prior to Work Complete]) &&
   Leave[Most Recent Date Prior to Work Complete] <> Blank()
))

RETURN if (CalculatedAdjustment > 0, CalculatedAdjustment, 0)

সুতরাং আমরা প্রতিটি পূর্ববর্তী গ্রুপে শেষ দিনটি দেখি এবং যদি এই সমন্বয়গুলির মোট যোগফলের ইতিবাচক মান থাকে তবে আমরা এটিকে প্রয়োগ করি এবং যদি এটি নেতিবাচক হয় তবে আমরা এটিকে পরিবর্তে একা রেখে যাই। এছাড়াও, যদি আমাদের ব্যক্তির প্রথম কয়েক দিন অ-কার্যদিবস দিন হয় তবে আমরা আমাদের সামঞ্জস্যের প্রাথমিক নেতিবাচক বিটটি মোটেও চাই না যাতে এটি ফিল্টারটিও সরে যায়।

(4) এই শেষ পদক্ষেপটি চূড়ান্ত ফলাফলের মধ্যে সমন্বয় আনবে। দুটি নতুন কলামের যোগফল যোগ করুন এবং অবশেষে আমাদের উচিত আমাদের অ্যাডজাস্টেড চলমান দৈনিক ভারসাম্য। ভাল খবর!

Adjusted Running Daily Balance = Leave[Grouped RDB] + Leave[Grouped RDB Adjustment]

আমরা এই ফলাফলের পথে প্রচুর অতিরিক্ত কলাম তৈরি করেছি যা সাধারণত আমার পছন্দের জিনিস নয়। কিন্তু, এটি একটি কৌতুকপূর্ণ ছিল।


হাই @ রায়ান বি এটি আমার সংস্থার 200 জনেরও বেশি লোকের জন্য নিখুঁতভাবে কাজ করে তবে একজন কাজ করছে না। আমি কোডটি নিজেই পরিবর্তন করার চেষ্টা করেছি তবে সমস্যা সমাধানের জন্য আমি কিছুই পেতে পারি না। আমি মনে করি কারণ এটি দীর্ঘ সময় কাজ করেছে এবং আরও সময় কাটানোর ঠিক একদিন আগে কাজ করেছে। সমস্যাটি দেখানোর জন্য আমি একটি চিত্রের সাথে লিঙ্ক করেছি। ধন্যবাদ চিত্র
LynseyC

আমি "গ্রুপযুক্ত আরডিবি অ্যাডজাস্টমেন্ট" পরিমাপটি সংশোধন করেছি যাতে এটি একাধিক "কাজ / কোনও কাজ না" চক্রের বাইরে ছুটির বৃহত পরিমাণে পাস করতে পারে।
রায়ান বি

2
হাই, সমস্ত প্রচেষ্টার জন্য ধন্যবাদ, অনেক প্রশংসা। দুর্ভাগ্যক্রমে পরিবর্তনটি সমস্যার সমাধান করেনি। তবে আমি যদি ফিল্টারটির শেষ শর্তটি সরিয়ে ফেলি "কাজ ছেড়ে যাওয়ার [সাম্প্রতিক তারিখের পূর্বে কাজ শেষ করার আগে] <> ফাঁকা ()" এটি সমস্যার সমাধান করে তবে এটি আবার মূল
লোকগুলির ক্যাল্কাগুলি

অঙ্কুর। ঠিক আছে, আমি আশা করি আপনি কার্যকর কিছু খুঁজে পেতে পারেন।
রায়ান বি

2

কিছুক্ষণ সময় নিল, তবে আমি একটি কাজের সাথে আসতে সক্ষম হয়েছি। ধরে নিই, ফাঁকাগুলির জন্য ভারসাম্য মান সর্বদা -1 এবং "কার্যকরী" এর জন্য মান 1 এবং সেই ডেটা ফাঁক ছাড়াই সমস্ত তারিখের জন্য উপলব্ধ, নীচের গণনার মতো কিছু কাজ করতে পারে:

Running Total = 
    VAR Employee = Leave[Employee ID]
    VAR Date1 = Leave[Date]
    VAR Prev_Blank = CALCULATE(MAX(Leave[Date]),
                        FILTER(Leave,Leave[Date] < Date1),
                        FILTER(Leave,Leave[Employee ID]=Employee),
                        FILTER(Leave,Leave[Type]=BLANK()))  
    VAR Day_count_Working = CALCULATE(COUNT(Leave[Date]),
                        FILTER(Leave,Leave[Date] > Prev_Blank),
                        FILTER(Leave,Leave[Date] <= Date1),
                        FILTER(Leave,Leave[Employee ID]=Employee),
                        FILTER(Leave,Leave[Type]="Working")) 
    VAR Day_count = CALCULATE(COUNT(Leave[Date]),
                        FILTER(Leave,Leave[Date] >= Prev_Blank),
                        FILTER(Leave,Leave[Date] <= Date1),
                        FILTER(Leave,Leave[Employee ID]=Employee)) 
RETURN (IF(Day_count_Working=BLANK(),Day_count,Day_count-1)-Day_count_Working)*-1 + Day_count_Working

মনে রাখবেন, আমি একটি ছোট নমুনা নিয়ে কাজ করার কারণে এটি কোনও প্রস্তুত পণ্য নাও হতে পারে, তবে এটি আপনাকে শুরু করা উচিত। আশাকরি এটা সাহায্য করবে.


ধন্যবাদ @ সিআর 7 এসএমএস। টাইপ = কাজ করার সময় এটি চলমান মোট পুনরায় সূচনা করে তবে টাইপ ফাঁকা থাকলে চলমান মোট কাজ করে না। Nov নভেম্বরের জন্য এটি কমে যায় 3 তবে তারপরে 8-14 নভেম্বর থেকে এটি -2 ফিরে আসে। প্রকারটি ফাঁকা থাকার সময় আপনি কী চলমান মোট কাজ করতে কোড সংশোধন করে সহায়তা করতে পারেন? ধন্যবাদ
LynseyC

হাই লিনসি, আমি একটি আলাদা গণনার চেষ্টা করেছি। গণনাটি কিছুটা দীর্ঘ হওয়ায় আমি এটি অন্য উত্তর হিসাবে যুক্ত করেছি। তবে আশা করি নতুন হিসাব কাজ করে।
সিআর 7 এসএমএস

@ সিআর 7 এসএমএস দয়া করে একটি প্রশ্নের একাধিক উত্তর যুক্ত করা এড়াবেন। এটি অন্যান্য ব্যবহারকারীদের বিভ্রান্ত করে যা একই সমস্যা / সমাধানের জন্য অনুসন্ধান করতে পারে এবং এটি দুর্দান্ত নয়। পরিবর্তে, আপনি একটি উত্তরের সমাধান হিসাবে যা আসতে পারে তার যোগ করা উচিত এবং প্রতিটি পৃথক দিকটি বিভাগে বিভক্ত করা উচিত।
ক্রিস্টোস লাইট্রাস

2

গণনাটি কিছুটা দীর্ঘ, তবে মনে হচ্ছে যে আমি ব্যবহার করছি সেই নমুনা ডেটাতে কাজ করছে। একবার চেষ্টা করে দেখুন:

Running Total = 
    VAR Employee = Leave[Employee ID]
    VAR Date1 = Leave[Date]
    VAR Prev_Blank = CALCULATE(MAX(Leave[Date]),
                        FILTER(Leave,Leave[Date] < Date1),
                        FILTER(Leave,Leave[Employee ID]=Employee),
                        FILTER(Leave,Leave[Type]=BLANK()))  
    VAR Prev_Working = CALCULATE(MAX(Leave[Date]),
                        FILTER(Leave,Leave[Date] < Date1),
                        FILTER(Leave,Leave[Employee ID]=Employee),
                        FILTER(Leave,Leave[Type]="Working"))    
    VAR Prev_Blank1 = CALCULATE(MAX(Leave[Date]),
                        FILTER(Leave,Leave[Date] < Prev_Working),
                        FILTER(Leave,Leave[Employee ID]=Employee),
                        FILTER(Leave,Leave[Type]=BLANK()))  
    VAR Prev_type = CALCULATE(MAX(Leave[Type]),
                        FILTER(Leave,Leave[Date] = Date1-1),
                        FILTER(Leave,Leave[Employee ID]=Employee))
    VAR Prev_Blank2 = IF(Leave[Type]="Working" && (Prev_Blank1=BLANK() || Prev_type=BLANK()),Date1-1,Prev_Blank1)    
    VAR Day_count_Working = CALCULATE(COUNT(Leave[Date]),
                        FILTER(Leave,Leave[Date] > Prev_Blank2),
                        FILTER(Leave,Leave[Date] <= Date1),
                        FILTER(Leave,Leave[Employee ID]=Employee),
                        FILTER(Leave,Leave[Type]="Working")) 
    VAR Day_count = CALCULATE(COUNT(Leave[Date]),
                        FILTER(Leave,Leave[Date] >= Prev_Blank2),
                        FILTER(Leave,Leave[Date] <= Date1),
                        FILTER(Leave,Leave[Employee ID]=Employee)) 
RETURN (IF(Day_count_Working=BLANK(),Day_count,Day_count-1)-Day_count_Working)*-1 + Day_count_Working

আমি এখানে ভেরিয়েবলের গুচ্ছ ব্যবহার করেছি। আপনি সম্ভবত একটি সংক্ষিপ্ত সংস্করণ সঙ্গে আসতে সক্ষম। মূলত ধারণাটি কোথা থেকে গণনা শুরু করতে হবে তা খুঁজে বের করার জন্য "ওয়ার্কিং" এর আগের প্রথম ঘটনাটি অনুসন্ধান করা। এটি "Prev_Blank2" ভেরিয়েবলে গণনা করা হয়। একবার যখন আমরা প্রারম্ভিক পয়েন্টটি জানতে পারি (এটি এখানে 1 দিয়ে শুরু হয়) তখন আমরা কেবল "ওয়ার্কিং" বা ফাঁকা () দিয়ে প্রিভ_ব্ল্যাঙ্ক 2 এবং বর্তমান রেকর্ডের তারিখের মধ্যে দিন গণনা করতে পারি। এই দিনগুলি ব্যবহার করে, আমরা মোট চলার জন্য চূড়ান্ত মানটি ফিরিয়ে দিতে পারি।

আশা করি এটি কৌশলটি করে;)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.