PDA

View Full Version : ایجاد یک View برای مقادیر تجمعی در جدول(لطفا کمک کنید)



tolid123456789
سه شنبه 25 اردیبهشت 1397, 10:45 صبح
سلام
من برای گزارش گیری در C# از دیتابیس SQL یک جدول به شکل زیر دارم:


تاریخ
مقدار


9601
1


9602
5


9603
8


9604
9


می خوام یک view بنویسم که مقادیر رو به صورت تجعی در کنار تاریخ قرار بدیه مثلا در مقدار رکورد 9602 مقدار ماه اول رو با دم جمع کنه و به جای 5 بنویسه 6 به عبارتی View به شکل زیر در بیاد:


تا تاریخ
مقدار تجمعی


9601
1


9602
6


9603
14


9604
23



لطفا مثل همیشه راهنمایی کنید.

ممنون.

danialafshari
سه شنبه 25 اردیبهشت 1397, 12:23 عصر
با سلام
میتونید از Window Function و PARTITION استفاده کنید
جدول:
CREATE TABLE REVENUE(
[DepartmentID] int,
[Revenue] int,
[Year] int
);
GO
اطلاعات:
insert into REVENUEvalues (1,10030,1998),(2,20000,1998),(3,40000,1998),
(1,20000,1999),(2,60000,1999),(3,50000,1999),
(1,40000,2000),(2,40000,2000),(3,60000,2000),
(1,30000,2001),(2,30000,2001),(3,70000,2001),
(1,90000,2002),(2,20000,2002),(3,80000,2002),
(1,10300,2003),(2,1000,2003), (3,90000,2003),
(1,10000,2004),(2,10000,2004),(3,10000,2004),
(1,20000,2005),(2,20000,2005),(3,20000,2005),
(1,40000,2006),(2,30000,2006),(3,30000,2006),
(1,70000,2007),(2,40000,2007),(3,40000,2007),
(1,50000,2008),(2,50000,2008),(3,50000,2008),
(1,20000,2009),(2,60000,2009),(3,60000,2009),
(1,30000,2010),(2,70000,2010),(3,70000,2010),
(1,80000,2011),(2,80000,2011),(3,80000,2011),
(1,10000,2012),(2,90000,2012),(3,90000,2012)
GO
کوئری :
select Year, DepartmentID, Revenue,sum(Revenue) OVER (PARTITION by DepartmentID ORDER BY [YEAR]
ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) as Prev3
From REVENUE order by departmentID, year;
GO
منبع : http://www.dotnettips.info/post/1142/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-window-function-%D9%87%D8%A7-%D8%AF%D8%B1-sql-server-%D8%A8%D8%AE%D8%B4-%D8%A7%D9%88%D9%84
موفق باشید

tolid123456789
سه شنبه 25 اردیبهشت 1397, 14:47 عصر
سلام
ممنون از پاسختون
من کد بالا رو برای جدولم به شکل زیر وارد کردم از Over تو view ارور می گیره
select date,sum(qty) over (partition by date order by [date] rows between 2 preceding and current row) as prev3 from table1

farhad_shiri_ex
چهارشنبه 26 اردیبهشت 1397, 18:47 عصر
سلام
ممنون از پاسختون
من کد بالا رو برای جدولم به شکل زیر وارد کردم از Over تو view ارور می گیره
select date,sum(qty) over (partition by date order by [date] rows between 2 preceding and current row) as prev3 from table1

این syntax usage برای دستور over از sql server 2012 به بعد سازگار هست در 2008 و قبل اون شکل دستورش فرق میکنه!

tolid123456789
پنج شنبه 27 اردیبهشت 1397, 16:16 عصر
سلام
ممنون از پاسختون
Sql من 2008 هست.
امکان داره شکل دستوریش رو تو sql2008 ارسال کنید؟

farhad_shiri_ex
پنج شنبه 27 اردیبهشت 1397, 17:56 عصر
سلام
ممنون از پاسختون
Sql من 2008 هست.
امکان داره شکل دستوریش رو تو sql2008 ارسال کنید؟

این شکل استفاده از دستور OVER در 2008 ..

select id,date,sum(qty) over(PARTITION BY date) as prev3
from table_1
order by id,date

در دستور فوق هر تاریخ را به هرتعدادی که باشد به یک پارتیشن جدا نمایش داده می شود و هر بخش هم جدا گانه مرتب شده است.
برای اینکه بتوانید خروجی کوئری که می خواهید ایجاد کنید باید خودتون Function و Sp بنویسید که این کار برای شما انجام بده البته در 2008