PDA

View Full Version : گرفتن دو ستون از یک ستون



sunn789
سه شنبه 24 بهمن 1391, 12:35 عصر
سلام
این سوال رو تو بخش دسترسی به /پایگاه داده (http://barnamenevis.org/showthread.php?382689-%D8%A8%DB%8C%D8%B1%D9%88%D9%86-%DA%A9%D8%B4%DB%8C%D8%AF%D9%86-%D8%AF%D9%88-%D8%B3%D8%AA%D9%88%D9%86-%D8%A7%D8%B2-%D8%AF%D8%A7%D8%AE%D9%84-%DB%8C%DA%A9-%D8%B3%D8%AA%D9%88%D9%86-%D8%A8%D8%A7-%D8%A7%D8%B1%D8%B3%D8%A7%D9%84-%DA%A9%D9%88%D8%B1%DB%8C) نیز نوشتم اما چون جوابی نرگرفتم و بهتر بود اینجا میگذاشتم دو باره می پرسم


ببینید ما این اطلاعات رو دریم
ItemValue/Value/Code{نام ستونها توی جدول}
702/5000/1
702/3000/2
703/2000/1
703/6000/2
حالا میخوام وقتی اطلاعات مربوط به کد 1 رو میخام اینجوری برگردونه
702/703{نام ستونها}
5000/2000
این دستور رو چه جور بنویسم میبینید ستون ItemValue رو میخوام به دو ستون تبدیل کنم
امیدوارم واضح باشه

یعنی اطلاعات تو یه ستونن اما میخوام با یک کوری دو تا ستون ازش بیرون بکشم

Reza_Yarahmadi
سه شنبه 24 بهمن 1391, 14:31 عصر
در مورد Pivot توی همین تالار جستجو کنید.

محمد سلیم آبادی
سه شنبه 24 بهمن 1391, 16:05 عصر
این و امتحان کنید:
select code,
max(case when rnk = 1 then itemvalue end) item1,
max(case when rnk = 1 then value end) value1,
max(case when rnk = 2 then itemvalue end) item2,
max(case when rnk = 2 then value end) value2,
from
(
select *, row_number() over(partition by code order by itemvalue) as rnk
from table_name
)t
group by code;

sunn789
سه شنبه 24 بهمن 1391, 23:42 عصر
در مورد Pivot طبق گفته دوستمون جستجو کردم اما همه اونها توی یه مرحله عمل ریاضی انجام مدادن ، من میخوام فقط دو ایتم 702و 703 از ستون f_SalaryItemCodeبیان بالا به عنوان سر ستون و ItemValueهر شخص -f_PersonCode-نیز زیرش نشون داده بشه ، اما کد زیر خطا میده

use SQLCash
Go
SELECT SalaryItem, [702],[703]
FROM (Select f_PersonCode,ItemValue,f_SalaryItemCode
FROM PersonnelPaidItemSalary )as a
Pivot
(
ItemValue for f_PersonCode in ([702],[703])) as b


و کد اصلیم اینه یعنی جدول این جوریه
SELECT TOP (200) f_PersonCode, f_SalaryItemCode, PaidYear, PaidMonth, ItemValue, Paid, PaidStatus, PaidSt, tmpField, ProcessCode, NationalNo
FROM PersonnelPaidItemSalary

محمد سلیم آبادی
چهارشنبه 25 بهمن 1391, 05:42 صبح
این را امتحان کنید، اگر خروجی مورد نظر نبود نام دو ستون زیر را در قسمت pivot کوئری جابجا کنید:
ItemValue
f_SalaryItemCode

use SQLCash
Go
SELECT f_PersonCode,[702],[703]
FROM (Select f_PersonCode,ItemValue,f_SalaryItemCode
FROM PersonnelPaidItemSalary )as a
Pivot
(
max(ItemValue) for f_SalaryItemCode in ([702],[703])
) as b

sunn789
چهارشنبه 25 بهمن 1391, 11:47 صبح
متشکر این درست اما مشکل اینه که فقط یه دیتا برام برمیگردونه max اما تو کوری تمام اطلاعات رو میخوام ، max رو بر میدارم هم جواب نمیده

محمد سلیم آبادی
چهارشنبه 25 بهمن 1391, 12:49 عصر
لطفا بر اساس داده های آزمایشی نتیجه مورد نظر را در قالب جدول (سطر و ستون) به نمایش در آورید.

sunn789
چهارشنبه 25 بهمن 1391, 13:22 عصر
سلام
عکس اول مربوط به زمانی که با voit کوئری نوشتم ، که فقط یک اطلاعات رو بر میگردونه
99995
اما عکس دوم یه کوری است که من معمولاً انتخاب میکنم فقط اینکه برای هر f_SalaryItemCodeمجبورم یه کوئری جدا بنویسم و یه گزارش جدا بگیرم 99996
حالا میخوام توی یه گزارش نشونش بدم ، یعنی الان اطلاعاتی نمایش داده میشوند که f_SalaryItemCode انها 708 ، میخوام اونهایی که f_SalaryItemCode برابر با 702 هم هست یه ستون کنار این اطلاعات شکا دوم نشون داده بشه
متشکر

محمد سلیم آبادی
چهارشنبه 25 بهمن 1391, 13:28 عصر
من هنوز متوجه نشدم که خروجی مورد نظر شما چیه!
query که با pivot ایجاد شده همون نیازی را براورده می کند که در پست اولتان ذکر کردین.
نیازی نیست که query های را در اینجا قرار دهید. فقط یک نمونه داده و یک نمونه نتیجه به ما نشان دهید.

sunn789
چهارشنبه 25 بهمن 1391, 13:34 عصر
ببینید اون کوئری اول که با pivot نوشتیم فقط یک رکورد بر میگردونه در صورتی که من میخوام تمام اطلاعات تشون داده بشه مثلاً توی کوئری اول ماکزیمم رو میده ولی من تمام اطلاعات رو میخوام مثل کوئری دوم ، کوئری دوم رو نوشتم تا بگم میخوام اطلاعات ItemValue اینجوری نشون داده بشه و ItemValue برای (f_SalaryItemCode = 708) رو که دارم برای (f_SalaryItemCode = 702) رو هم توی همین جدول کنار اون داشته باشم ، امیدوارم سختش نکرده باشم

محمد سلیم آبادی
چهارشنبه 25 بهمن 1391, 13:58 عصر
تعداد سطر هایی که به ازای (f_SalaryItemCode = 708) بر می گردد برابر است با تعداد سطرهایی که به ازای (f_SalaryItemCode = 702) برمیگردد؟
دقیقا چند F_SalaryItemCode در query باید اعمال شود؟

sunn789
چهارشنبه 25 بهمن 1391, 14:00 عصر
تعداد سطر ها ممکنه یکی نباشه
و در حال حاضر 3 عدد F_SalaryItemCode
که مثلاض تو برنامه من 702و703و708
هستتن

محمد سلیم آبادی
چهارشنبه 25 بهمن 1391, 14:12 عصر
;with cte1 as
(
select row_number() over(partition by f_PersonCode order by itemValue) as rnk,*
from PersonnelPaidItemSalary
where f_SalaryItemCode = 708
),
cte2 as
(
select row_number() over(partition by f_PersonCode order by itemValue) as rnk,*
from PersonnelPaidItemSalary
where f_SalaryItemCode = 702
),
cte3 as
(
select row_number() over(partition by f_PersonCode order by itemValue) as rnk, *
from PersonnelPaidItemSalary
where f_SalaryItemCode = 703
)
select *
from cte1
left outer join cte2 on cte1.f_PersonCode =cte2.f_PersonCode
and cte1.rnk = cte2.rnk
left outer join cte3
on cte1.f_PersonCode =cte3.f_PersonCode
and cte1.rnk = cte3.rnk

sunn789
چهارشنبه 25 بهمن 1391, 14:18 عصر
اول که باز خیلی متشکر دوم اینکه این سیستم که شما نوشتید به چه نامیه ، یعنی اگه بخوام در موردش بدونم چی رو باید یاد بگیرمبدون خطا اجرا شد.

محمد سلیم آبادی
چهارشنبه 25 بهمن 1391, 16:02 عصر
من مطمئن نیستم که درست منظورتون رو متوجه شده باشم.
شما برای درک آن query باید به مباحث زیر آشنا باشید:
common table expression
ranking function
multiple composite outer join

sunn789
دوشنبه 13 خرداد 1392, 20:13 عصر
سلام دوباره
از راهنمایی تون متشکر یه مطلب و اینکه اگه بخوام ORDER BY LName, dbo.Personnel.FatherName, dbo.PersonnelPaidItemSalary.PaidYear, dbo.PersonnelPaidItemSalary.PaidMonth
رو به این قسمت اضافه کنم کجا باید اضافه کنم؟
;with cte1 as
(
select row_number() over(partition by f_PersonCode order by ItemValue) as rnk,

dbo.Personnel.NationalNo AS NationalCode, dbo.Personnel.Name AS FName, dbo.Personnel.Family AS LName, dbo.Personnel.FatherName,
dbo.PersonnelPaidItemSalary.f_PersonCode, dbo.PersonnelPaidItemSalary.f_SalaryItemCode, dbo.PersonnelPaidItemSalary.PaidYear,
dbo.PersonnelPaidItemSalary.PaidMonth, dbo.PersonnelPaidItemSalary.ItemValue, dbo.PersonnelPaidItemSalary.Paid

from dbo.Personnel INNER JOIN
dbo.PersonnelPaidItemSalary ON
dbo.Personnel.PersonCode = dbo.PersonnelPaidItemSalary.f_PersonCode
WHERE (dbo.Personnel.CurrentYear = 1389) AND (dbo.Personnel.CurrentMonth = 10)
AND (dbo.PersonnelPaidItemSalary.PaidMonth BETWEEN 1 AND 12)
AND (dbo.Personnel.NationalNo =0000000000) AND f_SalaryItemCode = 702
),
cte2 as
(
select row_number() over(partition by f_PersonCode order by ItemValue) as rnk,

dbo.Personnel.NationalNo AS NationalCode,
dbo.PersonnelPaidItemSalary.f_PersonCode, dbo.PersonnelPaidItemSalary.f_SalaryItemCode, dbo.PersonnelPaidItemSalary.PaidYear,
dbo.PersonnelPaidItemSalary.PaidMonth, dbo.PersonnelPaidItemSalary.ItemValue, dbo.PersonnelPaidItemSalary.Paid

FROM dbo.Personnel INNER JOIN
dbo.PersonnelPaidItemSalary ON dbo.Personnel.PersonCode = dbo.PersonnelPaidItemSalary.f_PersonCode
WHERE (dbo.Personnel.CurrentYear = 1389) AND (dbo.Personnel.CurrentMonth = 10)
AND (dbo.PersonnelPaidItemSalary.PaidMonth BETWEEN 1 AND 12)
AND (dbo.Personnel.NationalNo =0000000000) AND f_SalaryItemCode = 703
),
cte3 as
(
select row_number() over(partition by f_PersonCode order by ItemValue) as rnk,

dbo.Personnel.NationalNo AS NationalCode,
dbo.PersonnelPaidItemSalary.f_PersonCode, dbo.PersonnelPaidItemSalary.f_SalaryItemCode, dbo.PersonnelPaidItemSalary.PaidYear,
dbo.PersonnelPaidItemSalary.PaidMonth, dbo.PersonnelPaidItemSalary.ItemValue, dbo.PersonnelPaidItemSalary.Paid

from dbo.Personnel INNER JOIN
dbo.PersonnelPaidItemSalary ON dbo.Personnel.PersonCode = dbo.PersonnelPaidItemSalary.f_PersonCode
WHERE (dbo.Personnel.CurrentYear = 1389) AND (dbo.Personnel.CurrentMonth = 10)
AND (dbo.PersonnelPaidItemSalary.PaidMonth BETWEEN 1 AND 12)
AND (dbo.Personnel.NationalNo =0000000000) AND f_SalaryItemCode = 708
)
select *
from cte1
left outer join cte2 on cte1.f_PersonCode =cte2.f_PersonCode
and cte1.rnk = cte2.rnk
left outer join cte3
on cte1.f_PersonCode =cte3.f_PersonCode
and cte1.rnk = cte3.rnk

با تشکر

sunn789
یک شنبه 26 خرداد 1392, 17:23 عصر
سلام
فقط اگه بفرمایید ORDER BY رو کجا باید نوشت ممنون میشم