View Full Version : تبدیل ستون به سطر در جداول
H.omidvar
سه شنبه 01 اردیبهشت 1394, 21:24 عصر
سلام. من دو جدول را با هم join کرده ام.که فیلد مشترک آنها id می باشد فیلدهای جدول اول غیر از id نام و فامیل می باشند.
در جدول دوم من غیر از id برای هر نفر یک یا چند رکورد شامل نام هزینه و مبلغ هزینه دارم که در صورت join اگر در جدول دوم تعداد هزینه یک id بیش از یک باشد تعداد خروجی من برای یک شخص بیش از یک است وچون امکان این هست که یک id در جدول دوم هیچ رکوردو دیگری یک رکورد و دیگری n رکورد داشته باشد من خروجی ای لازم دارم که برای هرشخص یک سطر خروجی داشته باشم ودر صورت نبودن اطلاعات برای شخص دیگر در ستونهای مربوطه فیلدها null شوند.به کمک و راهنمایی شما نیازمندم. تشکر
SabaSabouhi
چهارشنبه 02 اردیبهشت 1394, 00:37 صبح
سلام. من دو جدول را با هم join کرده ام.که فیلد مشترک آنها id می باشد فیلدهای جدول اول غیر از id نام و فامیل می باشند.
در جدول دوم من غیر از id برای هر نفر یک یا چند رکورد شامل نام هزینه و مبلغ هزینه دارم که در صورت join اگر در جدول دوم تعداد هزینه یک id بیش از یک باشد تعداد خروجی من برای یک شخص بیش از یک است وچون امکان این هست که یک id در جدول دوم هیچ رکوردو دیگری یک رکورد و دیگری n رکورد داشته باشد من خروجی ای لازم دارم که برای هرشخص یک سطر خروجی داشته باشم ودر صورت نبودن اطلاعات برای شخص دیگر در ستونهای مربوطه فیلدها null شوند.به کمک و راهنمایی شما نیازمندم. تشکر
سلام
join شما درست هست. چیزی که query شما کم داره یک group by هست. که فیلدهای جدول اول رو در بر بگیره و فیلدهای جدول دوم باید با استفاده از توابع گروهی مانند sum, min, max , count جمع بندی بشن.
صبا صبوحی
H.omidvar
چهارشنبه 02 اردیبهشت 1394, 07:01 صبح
من فیلدهای جدول دوم را همانطور که هستند می خواهم نه جمع، تعداد و غیره
H.omidvar
چهارشنبه 02 اردیبهشت 1394, 09:32 صبح
id
name
family
1
ali
omidvar
2
reza
hasani
id
paymentname
price
1
vam1
1000
1
vam2
2000
1
vam3
3000
2
vam6
5000
دو جدول فوق را داریم می خواهیم پس از join به این نتیجه برسم
id
name
family
p1
p_price1
p2
p_price2
p3
p_price3
p4
p_price4
1
ali
omidvar
vam1
1000
vam2
2000
vam3
3000
null
null
2
reza
hasani
null
null
null
null
null
null
vam6
5000
راهنمایی کنید چه دستوری بنویسم
golbafan
چهارشنبه 02 اردیبهشت 1394, 09:42 صبح
بعید میدونم همچین جوینی که شما میخواهید درست باشه
چون با زیاد شدن تعداد رکورد ها فیلدهای خروجی بیشتر میشه و اونوقت عمل select معنا نداره
SabaSabouhi
چهارشنبه 02 اردیبهشت 1394, 10:11 صبح
id
name
family
1
ali
omidvar
2
reza
hasani
id
paymentname
price
1
vam1
1000
1
vam2
2000
1
vam3
3000
2
vam6
5000
دو جدول فوق را داریم می خواهیم پس از join به این نتیجه برسم
id
name
family
p1
p_price1
p2
p_price2
p3
p_price3
p4
p_price4
1
ali
omidvar
vam1
1000
vam2
2000
vam3
3000
null
null
2
reza
hasani
null
null
null
null
null
null
vam6
5000
راهنمایی کنید چه دستوری بنویسم
سلام
نه این که امکان پذیر نباشه، اما شما اول بگو که یه همچنین خروجیای رو چطوری میخوای نمایش بدی؟ من کنترل یا کامپوننتی سراغ ندارم که امکان نمایش
همچنین خروجیای رو داشته باشه.
اگه میخوای خروجی excel هم بگیری، بهتره که خروجی رو با کد نویسی بسازی ( من تجربهای این کار رو دارم، خیلی به صرفهتره )
و اگه میخوای خروجی رو به صورت Grid تو برنامهات نشون بدی، بهتره از Gridهای سلسله مراتبی استفاده کنی که حالت درخت دارن و Master-Detail
هستن.
صبا صبوحی
H.omidvar
چهارشنبه 02 اردیبهشت 1394, 13:05 عصر
من دو جدول دارم که یکی اطلاعات هویتی پرسنل هست و دیگری وام های پرسنل یه ویو لازم دارم که وامهای پرسنل روبروی اطلاعات هویتی هرشخص اضافه بشه و در صورتیکه شخص وام نداشته باشه به تعداد وامهای دیگران رکورد nullداشته باشه و در صورتیکه وام جدیدی هم به دیتا اضافه شه خود بخود ویو ی من اونو اضافه کنه نه اینکه من ویو رو برای ماههای بعد ویرایش کنم.بدین صورت که جدول نتیجه من شامل اطلاعات هویتی شخص و تمام وامهای دریافتی شخص باشه و برای هر پرسنل یک رکورد داشته باشم.
SabaSabouhi
چهارشنبه 02 اردیبهشت 1394, 13:47 عصر
من دو جدول دارم که یکی اطلاعات هویتی پرسنل هست و دیگری وام های پرسنل یه ویو لازم دارم که وامهای پرسنل روبروی اطلاعات هویتی هرشخص اضافه بشه و در صورتیکه شخص وام نداشته باشه به تعداد وامهای دیگران رکورد nullداشته باشه و در صورتیکه وام جدیدی هم به دیتا اضافه شه خود بخود ویو ی من اونو اضافه کنه نه اینکه من ویو رو برای ماههای بعد ویرایش کنم.بدین صورت که جدول نتیجه من شامل اطلاعات هویتی شخص و تمام وامهای دریافتی شخص باشه و برای هر پرسنل یک رکورد داشته باشم.
سلام
دوست عزیز، اصلاً پستهای من و دوستم golbafan رو خوندی یا نه؟
یه پرسش ازت داشتم، اون رو اول جواب بده.
قضیه پرسنل و وام چیزی نیست که خاص باشه و من و دیگر دوستان تابحال با اون برخورد نکرده باشیم.
شما بگو میخوای چطوری این رو نمایش بدی.
در هر صورت آوردن این اطلاعات از سطر به ستون کاملاً اشتباه هست.
صبا صبوحی
Omid.Miresmaeili
چهارشنبه 02 اردیبهشت 1394, 14:08 عصر
id
name
family
1
ali
omidvar
2
reza
hasani
id
paymentname
price
1
vam1
1000
1
vam2
2000
1
vam3
3000
2
vam6
5000
دو جدول فوق را داریم می خواهیم پس از join به این نتیجه برسم
id
name
family
p1
p_price1
p2
p_price2
p3
p_price3
p4
p_price4
1
ali
omidvar
vam1
1000
vam2
2000
vam3
3000
null
null
2
reza
hasani
null
null
null
null
null
null
vam6
5000
راهنمایی کنید چه دستوری بنویسم
SELECT Table_1.id,Table_1.name,Table_1.family
Min(Case Table_2.paymentname When 'vam1' Then Table_2.paymentname End) p1,
Min(Case Table_2.paymentname When 'vam1' Then Table_2.price End) p_price1,
Min(Case Table_2.paymentname When 'vam2' Then Table_2.paymentname End) p2,
Min(Case Table_2.paymentname When 'vam2' Then Table_2.price End) p_price2,
Min(Case Table_2.paymentname When 'vam3' Then Table_2.paymentname End) p3,
Min(Case Table_2.paymentname When 'vam3' Then Table_2.price End) p_price3,
Min(Case Table_2.paymentname When 'vam6' Then Table_2.paymentname End) p4,
Min(Case Table_2.paymentname When 'vam6' Then Table_2.price End) p_price4
FROM Table_1 JOIN Table_2 ON Table_1.id = Table_2.Id
GROUP BY Table_1.id,Table_1.name,Table_1.family
H.omidvar
چهارشنبه 02 اردیبهشت 1394, 23:47 عصر
اینکه اطلاعات پایان ماه من بصورت سطری نمایش داده شود گنگ نیست بنده نیاز به ساخت یک ویو دارم که تعداد رکورد های ویو با تعداد پرسنل من در آن ماه برابری داشته و کلیه فیلدهای اطلاعاتی آن پرسنل در سایر جداول را نیز به صورت ریز در آن ویو نمایش دهم.
فیلدهای وام و پرداختی های پرسنل می تواند از صفر تا n تعداد باشد و نیاز من نمایش سطری آنها در ویو می باشد .من سایر موارد گفته شده را خود نیز میدانم بطور مثال دوست عزیزمان امید برای من جوابی نوشته که درست است ولی من فیلدهای خروجی را دارم در این select خود نامگذاری می کنم در صورتی احساس می کنم شاید یک حلقه (while&excute) یا یک triger بتواند فیلدهای بنده را به تعداد موجود بسازد و برای موارد خاص مقدار null بدهد . pivotنیز چنین عملی را انجام میدهد ولی در این مورد محدودیت دارد. راهنمایی نمایید.
golbafan
دوشنبه 07 اردیبهشت 1394, 12:15 عصر
اینکه اطلاعات پایان ماه من بصورت سطری نمایش داده شود گنگ نیست بنده نیاز به ساخت یک ویو دارم که تعداد رکورد های ویو با تعداد پرسنل من در آن ماه برابری داشته و کلیه فیلدهای اطلاعاتی آن پرسنل در سایر جداول را نیز به صورت ریز در آن ویو نمایش دهم.
فیلدهای وام و پرداختی های پرسنل می تواند از صفر تا n تعداد باشد و نیاز من نمایش سطری آنها در ویو می باشد .من سایر موارد گفته شده را خود نیز میدانم بطور مثال دوست عزیزمان امید برای من جوابی نوشته که درست است ولی من فیلدهای خروجی را دارم در این select خود نامگذاری می کنم در صورتی احساس می کنم شاید یک حلقه (while&excute) یا یک triger بتواند فیلدهای بنده را به تعداد موجود بسازد و برای موارد خاص مقدار null بدهد . pivotنیز چنین عملی را انجام میدهد ولی در این مورد محدودیت دارد. راهنمایی نمایید.
قبلا هم عرض کردم و دوست خوبم صبوحی هم به شما گفتن
این کار با کوئری کار درستی نیست...
اگر هم یه روزی بتونی انجامش بدی مطمئن باش اینقدر با باگهای مختلف روبرو میشی که پشیمونت میکنه...
پس بهترین راه برای شما استفاده از حالت نرمال join است و برای نمایش به این شکلی که میخوای باید کدنویسی کنی نه اینکه کوئری بزنی دوست عزیز:لبخندساده:
golbafan
دوشنبه 07 اردیبهشت 1394, 12:44 عصر
سلام دوست عزیز
با کوئری زدن حداکثر میشه این رو ایجاد کرد:
ایجاد join اولیه:
SELECT
usrs.id AS vid,
usrs.nam AS vnam,
usrs.fam AS vfam,
vams.vam AS vvam,
vams.prce AS vprce
from (`usrs` join `vams`)
where (`usrs`.`id` = `vams`.`uid`)
حالا اگر این رو بصورت view ثبت کنی بعدش باید روی این کوئری بعدی رو بزنی:
SELECT * from view1
PIVOT
(
SUM(vprce)
FOR vvam IN ((select vam from vams) as vamnames)
)AS view2
Kaziveh
جمعه 18 اردیبهشت 1394, 22:48 عصر
سلام .شما نیازمند استفاده از pivot ها هستید .
آموزش استفاده از pivot رو یه نگاه بنداز (http://hozhan.ir/Article/73/pivot-Table-%D8%AF%D8%B1---Sql-Server-%D9%82%D8%B3%D9%85%D8%AA-1/)
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.