PDA

View Full Version : بدست آوردن تفاضل یک فیلد در سطرهای متوالی



MOJTABAATEFEH
پنج شنبه 04 آبان 1391, 07:18 صبح
سلام دوستان عزیز من یکسری اطلاعات در یک جدول دارم که این اطلاعات بصورت تصادفی پر شده اند(جدول رو ضمیمه کردم) کوئری که میخوام به اینصورت است
همانطور که میبینید برخی ردیف های Actives_time مقدار گرفته است حالا در ستون Times تفاضل Actives_time سطر جاری با فقط یک سطر قبل رو میخوام قرار بدم برای دو ردیف اول کوئری که نوشتم درست عمل میکنه ولی برای سطرهای بعد نه چون از sum سطر جاری و sum سطرهای قبل استفاده کردم چه پیشنهادی دارید؟



select p.ro, P.T1, P.Time_Q1, P.T2, P.Time_Q2, P.SUM_T1, P.SUM_T2, P.LP, P.Actives_Time,
CASE WHEN ((select ISNULL(sum(Actives_Time), 0) from #P where RO <= p.RO) > 0) and
((select Actives_Time from #P where RO = p.RO) IS not null)
THEN (select ISNULL(sum(Actives_Time), 0) from #P where RO = p.RO)-(select ISNULL(sum(Actives_Time), 0) from #P where RO < p.RO)

END AS Times
from #p P order by ro

با تشکر

MOJTABAATEFEH
پنج شنبه 04 آبان 1391, 07:40 صبح
دوستان عزیز جواب رو به این صورت نوشتم و جواب گرفتم به این دلیل موضوع رو حذف نکردم گفتم شاید برخی با این مورد روبرو بشن و بتونن از این استفاده کنن

select p.ro, P.T1, P.Time_Q1, P.T2, P.Time_Q2, P.SUM_T1, P.SUM_T2, P.LP, P.Actives_Time,
CASE WHEN ((select ISNULL(sum(Actives_Time), 0) from #P where RO <= p.RO) > 0) and ((select Actives_Time from #P where RO = p.RO) IS not null)
THEN (select ISNULL(sum(Actives_Time), 0) from #P where RO = p.RO)-
(select ISNULL(sum(Actives_Time), 0) from #P where RO = (select MAX(ro) from #P where RO < p.ro and Actives_Time IS not null))

END AS Times
from #p P order by ro

موفق باشید

MOJTABAATEFEH
یک شنبه 28 آبان 1391, 14:49 عصر
دوستان عزیز سلام لطفا بگید با توجه به توضیحاتی که میدم برای جواب بایستی چطور عمل کرد؟

دوتا ماشین در یک خط تولید داریم که هر کدام به مدت زمان های T1,T2 کار میکنند و با مدت زمان های Time_Q1, Time_Q2 به حالت بیکاری می روند میخوام زمان هایی رو که هر دوتا ماشین به حالت تعمیر میروند(سیستم کلا بیکار است) رو بدست بیارم و در سطر مربوطه در فیلد مثلا LP یک عبارت درج بشه؟
در ضمن بطور مثال T1,T2 سطر اول از زمان صفر یا شروع سیستم شروع میشوند و T1 سطر دوم از T1 + Time_Q1 سطر اول شروع میشود و T2 سطر دوم از T2 + Time_Q2 سطر اول شروع میشود و تا آخر به همین صورت (چون کارکرد سیستم متوالی است)

Reza_Yarahmadi
دوشنبه 29 آبان 1391, 10:22 صبح
طراحی جدول برای کاری که میخواید یک مقدار مشکل داره.
به هر حال برای موردی که میخواید میشه بصورت زیر عمل کرد:
Declare @tbl TABLE
(
ID int IDENTITY (1, 1),
T1 float(53),
Q1 float(53),
T2 float(53),
Q2 float(53),
Sum1 float(53),
Sum2 float(53),
LP float(53)
)
Insert Into @Tbl Values (3.2, 4.9, 1.8, 1.2, 8.1, 3, NULL)
Insert Into @Tbl Values (0.6, 0.8, 11.7, 8.2, 9.5, 23.1, NULL)
Insert Into @Tbl Values (0.9, 3.1, 4.2, 1.5, 13.5, 28.8, NULL)
Insert Into @Tbl Values (6.6, 3.9, 4.4, 5.7, 24.0, 38.9, NULL)
Insert Into @Tbl Values (3.5, 5.0, 0.9, 1.8, 32.5, 41.6, NULL)


;With tblQ1 as(
Select
ID,
Sum1 - Q1 as StartQ1,
Sum1
From
@tbl)
, tblQ2 as(
Select
ID,
Sum2 - Q2 as StartQ2,
Sum2
From
@tbl)
Select
*,
Case
When StartQ1 Between StartQ2 AND Sum2
Then
Case
When(Sum1 > Sum2)
Then Sum2 - StartQ1
Else
Sum1 - StartQ1
End
Else
Case
When(Sum1 > Sum2)
Then Sum2 - StartQ2
Else
Sum1 - StartQ2
End
End
From
tblQ1 Inner Join tblQ2
ON
StartQ1 Between StartQ2 AND Sum2
OR
StartQ2 Between StartQ1 AND Sum1

MOJTABAATEFEH
شنبه 04 آذر 1391, 08:25 صبح
طراحی جدول برای کاری که میخواید یک مقدار مشکل داره.
به هر حال برای موردی که میخواید میشه بصورت زیر عمل کرد:
Declare @tbl TABLE
(
ID int IDENTITY (1, 1),
T1 float(53),
Q1 float(53),
T2 float(53),
Q2 float(53),
Sum1 float(53),
Sum2 float(53),
LP float(53)
)
Insert Into @Tbl Values (3.2, 4.9, 1.8, 1.2, 8.1, 3, NULL)
Insert Into @Tbl Values (0.6, 0.8, 11.7, 8.2, 9.5, 23.1, NULL)
Insert Into @Tbl Values (0.9, 3.1, 4.2, 1.5, 13.5, 28.8, NULL)
Insert Into @Tbl Values (6.6, 3.9, 4.4, 5.7, 24.0, 38.9, NULL)
Insert Into @Tbl Values (3.5, 5.0, 0.9, 1.8, 32.5, 41.6, NULL)


;With tblQ1 as(
Select
ID,
Sum1 - Q1 as StartQ1,
Sum1
From
@tbl)
, tblQ2 as(
Select
ID,
Sum2 - Q2 as StartQ2,
Sum2
From
@tbl)
Select
*,
Case
When StartQ1 Between StartQ2 AND Sum2
Then
Case
When(Sum1 > Sum2)
Then Sum2 - StartQ1
Else
Sum1 - StartQ1
End
Else
Case
When(Sum1 > Sum2)
Then Sum2 - StartQ2
Else
Sum1 - StartQ2
End
End
From
tblQ1 Inner Join tblQ2
ON
StartQ1 Between StartQ2 AND Sum2
OR
StartQ2 Between StartQ1 AND Sum1


ممنون دوست عزیز بابت پاسختون ولی همانطور که شما نوشتید ما چهار ردیف عدد در جدول TBL وارد کردیم که هر ردیف نمایان گر یک پریود کار دستگاه است لازم به ذکر است در هر ردیف بایستی مقایسه های T1,Q1-T2,Q2 انجام شود و در نهایت نیز همین چهار ردیف باشند در صورتی که در جواب نهایی 2 ردیف برگردانده می شود لطفا بررسی نمایید

شاد و پیروز باشید