فصل نوزدهم — تغییر Data Type در Power Query؛ ساده به نظر میرسد، ولی خیلی مهم است
تغییر Data Type در Power Query؛ ساده به نظر میرسد، ولی خیلی مهم است
بخشی از آموزش جامع Power BI
محتوای درس تغییر Data Type در Power Query؛ ساده به نظر میرسد، ولی خیلی مهم است
مقدمه؛ چرا نوع داده اینقدر مهم است؟
فرض کن ستون «مبلغ فروش» از Excel آمده ولی Power Query آن را Text تشخیص داده. ظاهر اعداد درست است، اما وقتی بخواهی Sum بگیری یا مدل را بسازی، تازه دردسر شروع میشود. Data Type به Power BI میگوید هر ستون واقعاً چه جور دادهای است و چه عملیاتهایی روی آن معنی دارد.
در این فصل با زبان ساده یاد میگیریم نوع داده را تشخیص بدهیم، تغییر بدهیم، خطاهای تبدیل را پیدا کنیم و مخصوصاً در تاریخ و اعداد فارسی/محلی گرفتار تنظیمات Locale نشویم.
۱۹.۱. Data Type یعنی چه؟
Data Type یعنی قرارداد ما با سیستم درباره ماهیت یک ستون. «1405» ممکن است کد سال باشد، عدد قابل محاسبه باشد یا حتی بخشی از یک شناسه متنی. انتخاب نوع فقط به شکل ظاهری مقدار بستگی ندارد؛ به معنی کسبوکاری آن هم بستگی دارد.
۱۹.۲. انواع پرکاربرد
| نوع | نمونه | کاربرد |
|---|---|---|
| Text | IKCO-001 | کد، نام، شناسه |
| Whole Number | 125 | تعداد |
| Decimal Number | 125.75 | مقدار اعشاری |
| Fixed Decimal/Currency | مبالغ مالی | محاسبات مالی متناسب |
| Date | 2026-08-20 | تاریخ |
| Date/Time | 2026-08-20 08:30 | زمان رخداد |
| True/False | true | فلگ منطقی |
۱۹.۳. تشخیص خودکار همیشه درست نیست
Power Query معمولاً سعی میکند نوع ستون را حدس بزند. این قابلیت مفید است، ولی قرار نیست چشمبسته قبولش کنیم.
مثلاً کد محصول 00125 اگر Number شود، صفرهای اولش از بین میرود. پس ProductCode باید Text بماند.
۱۹.۴. Changed Type چیست؟
وقتی Power Query نوع ستونها را تشخیص یا تغییر میدهد، معمولاً یک Step با عنوان Changed Type در Applied Steps میبینی.
= Table.TransformColumnTypes(Source,{{"Quantity", Int64.Type},{"SalesAmount", type number}})
۱۹.۵. تغییر نوع از رابط کاربری
ستون را انتخاب کن، روی آیکون نوع داده کنار نام ستون یا Data Type در Ribbon بزن و نوع مناسب را انتخاب کن. بعد Applied Steps را نگاه کن تا دقیقاً بدانی چه تغییری ثبت شده است.
۱۹.۶. مثال واقعی فروش
| ستون خام | نوع پیشنهادی | دلیل |
|---|---|---|
| OrderNo | Text | شناسه است، نه عدد محاسباتی |
| OrderDate | Date | تحلیل زمانی |
| Quantity | Whole Number | تعداد |
| UnitPrice | Decimal/Fixed Decimal | مبلغ |
| IsApproved | True/False | وضعیت منطقی |
۱۹.۷. عددی که نباید Number باشد
شماره موبایل، کد ملی، کد قطعه، شماره سفارش و بعضی شمارهحسابها ممکن است فقط از رقم تشکیل شده باشند، اما ماهیتشان عدد ریاضی نیست.
نکته: اگر قرار نیست روی یک مقدار جمع، میانگین یا عملیات عددی انجام بدهی، فقط به خاطر رقمی بودن آن Number انتخاب نکن.
۱۹.۸. خطای تبدیل
اگر در یک ستون عددی مقدار «نامشخص» وجود داشته باشد و ستون را Number کنیم، آن ردیف Error میشود. این خطا دشمن نیست؛ علامت میدهد کیفیت داده مسئله دارد.
1250
980
نامشخص ← conversion error
760
۱۹.۹. قبل از Replace Error علت را بفهم
وسوسه نشو هر Error را سریع با صفر جایگزین کنی. صفر خودش یک مقدار کسبوکاری است و ممکن است معنی داده را عوض کند.
اول مشخص کن مقدار نامعتبر چرا وارد ستون شده و سیاست درست پاکسازی چیست.
۱۹.۱۰. Locale؛ مشکل پنهان تاریخ و اعشار
فرمت تاریخ و جداکننده اعشار در کشورها متفاوت است. مثلاً 01/02/2026 میتواند برای دو سیستم معنی متفاوتی داشته باشد. در تبدیلهای حساس از Using Locale استفاده کن.
۱۹.۱۱. Change Type Using Locale
وقتی داده با فرهنگ مشخصی تولید شده، نوع مقصد و Locale منبع را با هم تعیین میکنیم تا Power Query مقدار را درست تفسیر کند.
این موضوع در فایلهای CSV و Excel دریافتی از سیستمهای مختلف خیلی مهم میشود.
۱۹.۱۲. Date و Date/Time
اگر فقط روز برای تحلیل مهم است، Date معمولاً تمیزتر است. اگر ساعت سفارش یا رخداد اهمیت دارد، Date/Time لازم میشود.
نوع را بر اساس سؤال تحلیلی انتخاب کن، نه صرفاً بیشترین جزئیات ممکن.
۱۹.۱۳. Decimal و Fixed Decimal
برای مقادیر اعشاری عمومی Decimal رایج است. برای سناریوهای مالی باید نوع عدد و دقت مورد نیاز را آگاهانه انتخاب کنی.
همیشه تعریف سیستم منبع و قواعد مالی پروژه را مبنا قرار بده.
۱۹.۱۴. تبدیل Text به Number
Table.TransformColumnTypes(
Source,
{{"SalesAmount", type number}}
)
اگر ستون شامل فاصله، علامت پول یا متن اضافه باشد، ممکن است قبل از تبدیل به پاکسازی نیاز داشته باشد.
۱۹.۱۵. Trim و Clean قبل از تبدیل
گاهی مقدار « 1250 » به خاطر فاصلههای اضافه یا کاراکترهای نامرئی دردسر میسازد. قبل از تبدیل، Text.Trim و در صورت نیاز Clean میتواند کمک کند.
Text.Trim([AmountText])
۱۹.۱۶. تبدیل تاریخ متنی
اگر تاریخ به شکل Text آمده، ابتدا مشخص کن فرمت واقعی چیست. بعد با Locale مناسب آن را تبدیل کن. حدس زدن تاریخ یکی از خطرناکترین کارهای ETL است.
۱۹.۱۷. Null با Zero فرق دارد
| مقدار | معنی احتمالی |
|---|---|
| null | مقدار موجود/ثبت نشده |
| 0 | مقدار ثبت شده و برابر صفر |
| "" | رشته خالی |
این سه را بیدلیل به هم تبدیل نکن.
۱۹.۱۸. Boolean
ستونهایی مثل IsActive، IsApproved یا HasWarranty برای True/False مناسباند؛ البته اگر سیستم منبع واقعاً دو حالت داشته باشد.
اگر وضعیت سهحالته مثل Pending هم داریم، Boolean انتخاب درستی نیست.
۱۹.۱۹. نوع داده و مدل
نوع صحیح در Power Query روی فشردهسازی، Relationship، DAX و رفتار Visualها اثر میگذارد. اصلاح نوع داده را تا آخر پروژه عقب نینداز.
۱۹.۲۰. نوع داده و Relationship
کلیدهایی که به هم Relationship میشوند باید از نظر نوع داده سازگار باشند. ProductKey عددی در Fact و ProductKey متنی در Dimension علامت طراحی ناسازگار است.
۱۹.۲۱. نوع داده و DAX
اگر SalesAmount به صورت Text بارگذاری شود، Measureهای عددی طبیعی روی آن قابل استفاده نیستند. بهتر است مسئله نوع داده را در مرحله مناسب حل کنیم، نه با DAXهای عجیب.
۱۹.۲۲. Profiling
Column Quality، Column Distribution و Column Profile میتوانند در شناخت Null، Error و توزیع داده کمک کنند.
قبل از تغییر گسترده نوع، ستونهای حساس را Profile کن.
۱۹.۲۳. نمونه شرکت هانا
فایل فروش شعبه از Excel آمده و ستون Amount در بعضی ردیفها عدد، در بعضی ردیفها «-» و در چند ردیف خالی است. اول باید سیاست داده مشخص شود: خط تیره یعنی صفر، ناموجود یا خطای ورود؟
تا معنی روشن نشده، تبدیل کورکورانه به Number کار حرفهای نیست.
۱۹.۲۴. الگوی پیشنهادی پاکسازی
Inspect
→ Define business meaning
→ Clean text
→ Handle invalid values
→ Convert type
→ Validate errors
→ Load
۱۹.۲۵. ترتیب Stepها
اگر خیلی زود نوع داده را تبدیل کنی و بعد بخواهی متن را پاکسازی کنی، ممکن است Stepها پیچیده شوند. ترتیب Transformationها را آگاهانه انتخاب کن.
۱۹.۲۶. Schema Drift
ممکن است امروز ستون Quantity عددی باشد ولی ماه بعد سیستم منبع یک مقدار متنی جدید وارد کند. Refresh ممکن است Fail شود یا Error تولید شود.
برای منابع ناپایدار، کنترل کیفیت و قرارداد داده اهمیت بیشتری دارد.
۱۹.۲۷. تست بعد از تبدیل
| کنترل | سؤال |
|---|---|
| Error Count | چند ردیف خطا داریم؟ |
| Null Count | Nullها منطقیاند؟ |
| Min/Max | مقادیر عجیب داریم؟ |
| Sample | چند ردیف با منبع تطبیق دارد؟ |
| Relationship | کلیدها سازگارند؟ |
۱۹.۲۸. اشتباه رایج؛ تبدیل شناسه به عدد
کد 000124 اگر Number شود به 124 تبدیل میشود. اگر صفرهای ابتدایی بخشی از شناسه باشند، اطلاعات از دست رفته است.
۱۹.۲۹. اشتباه رایج؛ Replace Error با صفر
این کار ممکن است گزارش را بدون Error کند، ولی داده را غلط کند. اول معنی Error را بفهم.
۱۹.۳۰. اشتباه رایج؛ تاریخ بدون Locale
تاریخی که روی سیستم تو درست دیده میشود ممکن است در محیط دیگری اشتباه تفسیر شود. برای فرمتهای مبهم Locale را صریح کن.
۱۹.۳۱. Best Practiceها
نوع داده را بر اساس معنی کسبوکاری انتخاب کن.
شناسهها را معمولاً Text نگه دار مگر دلیل مشخصی برای عددی بودن وجود داشته باشد.
بعد از تبدیل، Errorها را بررسی کن.
Null را بیدلیل Zero نکن.
برای تاریخ و اعداد محلی Locale را جدی بگیر.
نوع کلیدهای Relationship را هماهنگ نگه دار.
Stepهای Changed Type را در Queryهای مهم بازبینی کن.
۱۹.۳۲. تمرین پایه
یک جدول با ستونهای CustomerCode، OrderDate، Quantity، Amount و IsActive بساز و نوع مناسب هر ستون را تعیین کن. برای هر انتخاب یک دلیل بنویس.
۱۹.۳۳. تمرین متوسط
ستون AmountText با مقادیر 1200، 950، خط تیره، Null و 1,250 را پاکسازی کن و فقط بعد از تعیین سیاست کسبوکار به عدد تبدیل کن.
۱۹.۳۴. تمرین تاریخ
دو فایل با فرمتهای تاریخی متفاوت فرض کن. توضیح بده چطور با Using Locale جلوی تفسیر اشتباه را میگیری.
۱۹.۳۵. پروژه فصل؛ Data Type Audit شرکت هانا
| مرحله | خروجی |
|---|---|
| Inventory | فهرست ستونها و نوع فعلی |
| Business Meaning | معنی واقعی ستون |
| Risk | شناسه/تاریخ/مبلغ حساس |
| Conversion | نوع مقصد |
| Quality | Error/Null checks |
| Validation | تطبیق با منبع |
در پایان یک Data Type Dictionary کوچک برای مدل فروش شرکت هانا تحویل بده.
جمعبندی فصل نوزدهم
Data Type شاید یکی از سادهترین منوهای Power Query باشد، ولی اشتباه در آن میتواند از صفرهای گمشده کد محصول تا تاریخ اشتباه و Measure خراب ایجاد کند.
Meaning first → Type second → Validate always
در فصل بیستم سراغ Split Column و Merge Columns میرویم و یاد میگیریم چطور ستونهای شلوغ را به داده قابل تحلیل تبدیل کنیم.