خانه SQL Server PIVOT و UNPIVOT در SQL Server – قسمت دوم SQL Server دستورات SQL نوشته شده توسط: مهدی شیشه بری تاریخ انتشار: ۰۲ تیر ۱۳۹۵ آخرین بروزرسانی: ۱۴ مهر ۱۴۰۲ زمان مطالعه: 6 دقیقه ۴.۳ (۶) مقدمه PIVOT و UNPIVOT در SQL Server در قسمت اول، با ساختار PIVOT و نحوه چگونگی استفاده از آن آشنا شدید. این بار به سراغ دیتابیس معروف Northwind می رویم و می خواهیم بدانیم در جدول Customers به ازای کشورهای uk، spain و usa چه تعداد کارمند داریم. بنابراین در ابتدای کار می بایست تکلیف سه مورد زیر را مشخص کنیم: Aggregate Column: فیلد CustomerID PIVOT Column: فیلد Country لیستی که قرار است گزارش براساس آن تهیه شود که در مثال فرضی ما، مقادیر فیلد Country و شامل uk، spain و usa خواهد بود. اسکریپت زیر را اجرا می کنیم: SELECT * FROM (SELECT Country,CustomerID FROM Customers)C PIVOT (COUNT(CustomerID) FOR Country IN ([uk],[usa],[spain]))pTable خوب، تا این جای کار همه چیز مطابق با خواسته ما بود اما آیا شما می دانید که در جدول Customers چه کشورهایی وجود دارد؟ اگر تعداد این کشورها زیاد باشد، آیا منطقی است که پس از شناسایی آن ها، لیست عریض و طویلی از عنوان کشورها را در جلو IN و در ساختار PIVOT، ردیف کنیم؟ آیا این امکان وجود ندارد که در آینده عناوین کشورهای جدیدی به جدول مان اضافه شوند؟ و … پاسخ مناسب به حل مشکلات مطرح شده، استفاده از Dynamic T-SQL خواهد بود. Dynamic T-SQL در واقع اسکریپت هایی است که به صورت Dynamic ایجاد می کنیم و در همان لحظه، آن ها را اجرا می کنیم. با استفاده از Dynamic T-SQL می توان شرایطی پویا و متنوع در زمان اجرای یک کوئری ایجاد کرد. در اسکریپت زیر، متغیرهای مورد نیاز را تعریف و مقداردهی کرده و سپس با الحاق مناسبی با عبارات T-SQL، از طریق EXEC آن ها را اجرا می کنیم. اکنون برای آن که بتوانیم یک Dynamic PIVOT داشته باشیم، دقیقا از این تکنیک استفاده می کنیم. فرض می کنیم که می خواهیم بدانیم از هر کشور چه تعداد مشتری داریم. پس می بایست لیست کشورهای موجود را از جدول Customers استخراج کنیم. DECLARE @country VARCHAR(MAX) SET @country='' SELECT @country=@country+Country+',' FROM Customers GROUP BY Country SET @country=LEFT(@country,LEN(@country)-1) ابتدا متغیرcountry@ را تعریف می کنیم. در خط دوم اسکریپت بالا، ابتدا مقدار country@ را برابر Blank قرار می دهیم. توجه داشته باشید که اگر این کار را انجام ندهید با مشکل روبرو خواهید شد زیرا در ابتدا، مقدار country@ در هنگام تعریف، برابر با NULL خواهد بود و همواره جمع یک رشته با NULL برابر با NULL خواهد شد! در عبارت SELECT، تمامی کشورها را از طریق جدول Customers در متغیرcountry@ به همراه جداکننده ویرگول، ذخیره می کنیم. توجه داشته باشید که استفاده از GROUP BY به منظور جلوگیری از درج تکراری عناوین کشورها است. در خط آخر هم با توجه به این که در انتهای رشته ی country@ یک علامت ویرگول اضافی داریم، آن را حذف می کنیم. لیست تمامی کشورها در متغیر country@ ذخیره شده و می بایست آن را به عنوان لیست مورد جستجو در جلو عبارت IN در ساختار PIVOT قرار دهیم. EXEC('SELECT * FROM (SELECT Country,customerID FROM Customers)C PIVOT (count(customerID) FOR Country IN ('+@country+'))pTable') و اما حالا شما به عنوان تمرین، تلاش کنید کوئری ای بنویسید که خروجی زیر را نمایش دهد. این خروجی قرار است گزارشی باشد که عناوین همه customerIDها در Header قرار گرفته و متناسب با هر کدام، CompanyNameشان نمایش داده شود. چه رتبه ای میدهید؟ میانگین ۴.۳ / ۵. از مجموع ۶ اولین نفر باش معرفی نویسنده معرفی محصول ایمان باقری دوره آموزشی کوئری نویسی در SQL Server 2.190.000 تومان مقالات مرتبط ۱۰ شهریور مهندسی داده NoSQL چیست؟ هر آن چیزی که باید بدانید! تیم فنی نیک آموز ۰۹ شهریور زبان های برنامه نویسی چگونه میتوان Blazor را برای ساخت برنامههای (PWA (App Web Progressive استفاده کرد؟ تیم فنی نیک آموز ۰۸ شهریور زبان های برنامه نویسی Eloquent در لاراول و جادوی کاربردیاش تیم فنی نیک آموز ۰۸ شهریور SQL Server اهمیت مانیتورینگ در SQL Server چیست؟ | تمام آنچه که باید از مانیتورینگ بدانید تیم فنی نیک آموز دیدگاه کاربران لغو پاسخ دیدگاه نام و نام خانوادگی ایمیل ذخیره نام، ایمیل و وبسایت من در مرورگر برای زمانی که دوباره دیدگاهی مینویسم. موبایل برای اطلاع از پاسخ لطفاً مرا با خبر کن ثبت دیدگاه Δ فرشید علی اکبری ۰۳ / ۰۴ / ۹۵ - ۱۱:۰۸ سلام با تشکر از مطلبی که ارائه کردید، باید عرض کنم که کاربرد Pivot در استفاده از واکشی داده های مورد نظر از دیتابیس یکی از موارد بسیار حائز اهمیت برای برنامه نویسان (بخصوص در نرم افزارهای مالی، سیستم فروش و سیستم های اطلاعاتی از جمله داشبوردهای مدیریتی) می باشد که شما برای تفهیم بهتر، خیلی ساده و شفاف این موضوع را برای کاربران بازدید کننده با مثال بیان کردید و مطمئناً برای آندسته از دوستانی که تاکنون با این امکان آشنایی چندانی نداشته اند، به راحتی قابل هضم میباشد. پاسخ به دیدگاه مهدی شیشه بری ۰۵ / ۰۴ / ۹۵ - ۰۹:۱۷ سلامتمام تلاشم این بود که بتوانم به ساده ترین شکل ممکن مفهوم PIVOT را توضیح بدهم.از حسن توجه شما بینهایت سپاس گزارم. پاسخ به دیدگاه 1 2