PDA

View Full Version : CTE Recursive



MaryamMarz
چهارشنبه 13 آبان 1388, 13:26 عصر
سلام
من یک view دارم که ساختار آن درختی است و یک فیلد ParentID دارد که به ID ارجاع داده می شود . می خواهم مقدار یکی از فیلدهای رکورد های آن را بر حسب ParentID جمع کنم.
یعنی مثل Group By. این کار را با استفاده از CTE می خواهم انجام بدهم ولی CTE من همان تعداد رکورد View را بر می گرداند و هیچ جمعی هم انجام نمی دهد.
اگر راهنمایی بفرمایید ممنون خواهم شد.

;with mycte
as
(select JobCategoryId, JobCategory, JobCategoryParentID, DistributionEmployee1+DistributionEmployee2+Distri butionEmployee3 as JobCount
from JobSubCAtegoryRecord
union all
select J.JobCategoryId, J.JobCategory, J.JobCategoryParentID, DistributionEmployee1+DistributionEmployee2+Distri butionEmployee3+JobCount as JobCount
from JobSubCAtegoryRecord J join mycte m on j.JobCategoryID = m.JobCategoryParentID
)
select * from mycte

مهدی نان شکری
چهارشنبه 13 آبان 1388, 18:19 عصر
با سلام
اگر امکان داشته باشه بیشتر توضیح بدین.

AminSobati
چهارشنبه 13 آبان 1388, 20:34 عصر
سلام دوست عزیزم،
سوال شما برای من هم مبهمه. اگر ممکنه یک نمونه از اصل اطلاعات به همراه نتیجه مورد نظر (حتی اگر شده به صورت کاراکتر) پست کنید

محمد سلیم آبادی
چهارشنبه 13 آبان 1388, 22:24 عصر
می خواهم مقدار یکی از فیلدهای رکورد های آن را بر حسب ParentID جمع کنم.


سلام،
بطور مثال منظورتان این است که حقوق تمام کارکنان زیر دست یک Parent را تا node برگ محاسبه و با یکدیگر جمع کنید؟ یعنی جمع تمام مقدایر ستون حقوق تمام کارکنان زیر شاخه ParentID.

MaryamMarz
شنبه 16 آبان 1388, 10:32 صبح
اصل اطلاعات که view بر می گرداند به صورت زیر است:

کد سطر نام سطر نام Parent تعداد

00.12.02.1.1 سطریک مديريت بازرسي 1
00.12.02.2 معاونت تضمين كيفيت - 1
00.12.02.1.2 سطردو مديريت بازرسي 1
00.12.02.1.2 سطردو مديريت بازرسي 1
00.12.02.2 معاونت تضمين كيفيت - 1
00.12.02.1.1 سطر یک مديريت بازرسي 1
00.12.02.1.1 سطر یک مديريت بازرسي 1
00.12.02.5.1 سطر یک مديريت صنعت 1
00.12.02.5.2 بند فرعی جدید مديريت صنعت 1
00.12.02.5.2 بند فرعی جدید مديريت صنعت 1
00.12.02.4 معاونت مالي - 1
00.12.02.4 معاونت مالي - 1


من نتیجه را به شکل زیر می خواهم:

مدیریت بازرسی 5
معاونت تضمين كيفيت 2
مديريت صنعت 3
معاونت مالي 2

محمد سلیم آبادی
شنبه 16 آبان 1388, 11:15 صبح
شما یک جدولی دارین با نام JobSubCAtegoryRecord .
و یک view ایجاد کردین که یک Recursive CTE را نگه داری می کند.

00.12.02.1.1 سطریک مديريت بازرسي 1
الان در سطر فوق نام گره = سطریک و نام پدر = مدیریت بازرسی است؟

00.12.02.4 معاونت مالي - 1

00.12.02.4 معاونت مالي - 1

در ساختار جدول هیچ کلیدی وجود ندارد؟ یعنی یک node می تواند چندین بار در یک درخت تکرار شود؟ مثل درخت زیر:



a
/ \
b b




;with mycte as
(
select JobCategoryId
, JobCategory
, JobCategoryParentID
, DistributionEmployee1+DistributionEmployee2+Distri butionEmployee3 as JobCount
, level = 1
from JobSubCAtegoryRecord

union all

select J.JobCategoryId
, J.JobCategory
, J.JobCategoryParentID
, J.DistributionEmployee1 + J.DistributionEmployee2 + J.DistributionEmployee3 as JobCount
, level = level + 1
from JobSubCAtegoryRecord as J
inner join mycte as m
on j.JobCategoryID = m.JobCategoryParentID
)
select JobCategoryId
, JobCategory
, sum(JobCount)
from mycte
group by JobCategoryId
, JobCategory

MaryamMarz
شنبه 16 آبان 1388, 15:11 عصر
درخت اطلاعات به شکل زیر است:
بنداصلی - بند فرعی1 - ... - بند فرعی n

هر بند اصلی می تواند چندین بند فرعی داشته باشد و بندهای فرعی هم خودشان می توانند دارای بند های فرعی دیگری باشند.
ما یک سری سطر داریم که به هر جایی از این درخت بندها می توانند وصل باشند و این سطرها در یک جدول دیگر ذخیره می شوند و تعداد مشاغل هم در هر سطر دخیره می شود.
من جمع تعداد مشاغل این سطرها را می خواهم تا سطح بند اصلی.
به عنوان مثال
بند اصلی = مدیریت بازرسی
خود این بند دو تا سطر داره با تعداد مشاغل 2 و 3
یک بند فرعی داره که اون هم سه تا سطر داره با تعداد مشاغل 1 و 1 و 3
این بند فرعی هم یک بند فرعی2 داره که اون هم دو تا سطر داره با تعداد 2 و 2
حالا ما تعداد مشاغل را در کل این بند اصلی می خواهیم که می شود : 14

اطلاعات سطرها در JobSubCategoryRecord وجود دارد و ما ID بندی که این سطر در آن قرار دارد را به عنوان JobCategoryID و ID بند والد آن را هم به عنوان JobCategoryParentID نگهداری می کنیم.
اطلاعات بندها از یک View دیگر به نام JobCategoryRecord قابل بازیابی است.
script این view ها را هم فرستادم.