PDA

View Full Version : دستوری برای تجمیع مقادیر یک ستون رشته ای با شرایط خاص(شبیه به Group By).



hossein2007
شنبه 25 دی 1389, 10:10 صبح
با سلام به همه دوستان.
فرض کنید یک جدول داریم که دو ستون به شکل زیر دارد:

- سال (عددی)
- نام (رشته ای)

مثلا :

1388 علی
1388 احمد
1388 رضا
1389 حسین
1389 نادر
--------------------------------------------------
حالا یه query احتیاج داریم که نتیجه زیر رو بده:

1388 علی احمد رضا
1389 حسین نادر

یه چیزی شبیه به دستور Group By که می توان مجموع، میانگین و ... یک ستون عددی رو به صورت گروه بندی بدست آورد.

ممنون می شم راهنمایی کنید.

behrouzlo
شنبه 25 دی 1389, 10:43 صبح
فکر کنم دستوری برای اینکار در خود SQL وجود ندارد. شما یا باید از cursor استفاده کنید. یا خودتان یک تابع تعریف کنید که با ارسال سال خروجی مورد نظر شما را برگشت دهد و این تابع را در بدنه Select اصلی خود فراخوانی کنید.

Reza_Yarahmadi
شنبه 25 دی 1389, 11:14 صبح
ميتونيد بصورت زير اين كار رو انجام بديد

Select
t.Year,
(select Name + ' ' from TableName Where Year = t.Year For Xml Path('')) as Users
From
TableName t
Group By
t.Year

hossein2007
شنبه 25 دی 1389, 11:40 صبح
با تشکر از راهنماییتون.
اگه ممکنه بگید قسمت For Xml Path('')) as Users چه کار می کنه؟

Reza_Yarahmadi
شنبه 25 دی 1389, 20:31 عصر
قسمت For Xml Path('')) as Users چه کار می کنه؟
بخش آخرش (as Users) که نام ستون رو تعیین میکنه.
در مورد For Xml Path هم دوست خوبمون بهزادصادقی (http://barnamenevis.org/member.php?161058-%D8%A8%D9%87%D8%B2%D8%A7%D8%AF%D8%B5%D8%A7%D8%AF%D 9%82%DB%8C) توضیح کاملی دادند منم اونو به صورت نقل قول میذارم.

for xml یک جمله است که شما می توانید به هر select ای اضافه کنید. کاربرد معمولی آن این است که به SQL Server دستور می دهد که مجموعه نتایج این query را، به جای اینکه به صورت یک مجموعه معمولی به ما برگرداند، آنها را در قالب یک XML document در آورد و آن xml را به ما باز گرداند.

استفاده از for xml معمولا فوق العاده پیچیده می باشد. من چند بار که سعی کرده ام از آن استفاده کنم، بعد از یکی دو ساعت بازی با آن، سرم گیج رفته.

ولی یکی از گزینه های آن، هم syntax خیلی ساده ای دارد، و هم یک کاربرد فوق العاده جالب و به درد به خوری.

هر وقت شما کلمات ('')for xml path را به آخر یک select که فقط یک ستون دارد اضافه می کنید، SQL Server می آید و رشته های کل آن سطر ها را به آخر هم وصل می کند و یک رشته که برابر است با جمع کل آنهاست باز می گرداند! و هیچ نشانی هم از xml دیده نمی شود.

معلوم نیست Microsoft جرا این قابلیت را به وجود آورد. ولی جند سال پیش، یک نفر که داشت با for xml بازی می کرد، متوجه این مسئله شد و به این فکر افتاد که می شود از این فابلیت استفاده کرد که یک مسئله قدیمی سخت و پرهزینه (از لحاظ عملکرد) را در SQL Server حل کرد. و آن همان مسئله جمع کردن یک سری رشته از سطر های مختلف جدول می باشد. برای یک چنین کاری، معمولا خیلی ها از یک cursor استفاده می کنند. ولی cursor عملکرد کد را به صورت باور نکردنی وحشتناکی می آورد پائین. xml for path این توانایی را به ما می دهد که این نوع مسائل را بدون استفاده از cursor و با سرعت خیلی بالای حل کنیم.

بعد از کشف این نکته، آن شخصی که این مسئله را کشف کرده بود این مطلب را در تالار های بحث SQL Server مثل همین تالار مطرح کرد، و بعد از مدت نسبتا کوتاهی این تکنیک بسیار در جهان SQL Server معروف و متداول گردید.