ورود

View Full Version : انتخاب بازه زمانی دوره‌ای در Query



SReza1
چهارشنبه 24 فروردین 1384, 18:43 عصر
یه سوال :
فرض کنید میخواهید یه Query از سیستم بگیرید . مثلا میخواهید در طی یک بازه تاریخی(منظورن بین دو تاریخ نیست بلکه در یک دوره زمانی آن هم در یک تاریخ معین مثل 7 روز 7 روز بین سال 1383/11/10 تا 1383/12/29 ) تعداد رکوردهای یه جدول رو بشمارید . هیچ شرطه دیگه ای نیست.
اگه روش بدون استفاده از Table temp میدانید بهتره. :موفق:

AminSobati
چهارشنبه 24 فروردین 1384, 19:04 عصر
دوست عزیزم،
اگر ممکنه بیشتر توضیح بدین. من هنوز دقیقا متوجه نشدم چه کاری میبایست انجام بشه.

SReza1
چهارشنبه 24 فروردین 1384, 19:26 عصر
خوب به نظرم کامل بود ولی دوباره توضیح میدم.

فرض کنید یک زیر سیستم دارید و میخواهید تعداد ورود به سیستم را بدانید. ولی بر طبق عدد روزی که کاربر وارد میکند . مثلا ٣ روز ٣ روز تعداد را نشان بدهد

Count ID
3 1
1 2
10 3
5 4

یعنی انکه در ٣ روز اول 3 روز در 3 روز دوم 1 بار و در ٣ روز سوم 10 روز و .....
:strange:

AminSobati
چهارشنبه 24 فروردین 1384, 20:44 عصر
دوست عزیزم،
کاری که شما نیاز دارید، به Custom Aggregation معروفه که در SQL Server 2000 وجود نداره ولی در 2005 مایکروسافت اون رو قرار داده.
برای انجام این کار در 2000، میبایست یک تابع بنویسین تا تاریخهایی که در یک بازه زمانی مثلا 10 روزه قرار دارند، یک عدد مشترک برگردونن تا بشه اونها رو Group By کرد. برای این سناریو، من جدول Orders در دیتابیس Northwind رو مثال میزنم. به فرض قصد داریم بدست بیاریم که در 10 روز اول چند سفارش داریم، در 10 روز دوم چند سفارش و الی آخر...

CREATE FUNCTION DBO.MyFunc (@BeginDate DateTime, @OrderDate DateTime, @Length TinyInt)
RETURNS Int
AS
BEGIN
DECLARE @DDiff Int
DECLARE @Period Int
SET @DDiff=DATEDIFF(Day, @BeginDate, @OrderDate)
SET @Period=@DDiff/@Length
RETURN @Period
END
پارامتر اول مشخص میکنه که شمارش از چه تاریخی به بعد باید شروع بشه. پارامتر دوم، تاریخ سفارش رو به تابع میده تا مشخص بشه این تاریخ، در کدام تقسیم بندی(پریود) قرار گرفته. پارامتر سوم، نحوه تقسیم بندی رو تعیین میکنه.
برای اینکه یکبار خروجی این تابع رو ببینیم، این Query رو اجرا میکنیم:

select orderid,orderdate,dbo.myfunc('1996-07-04',Orderdate,10) from orders order by orderdate
تاریخی که به عنوان مبداء دادیم، تاریخ اولین سفارش در جدول Orders هستش.
حالا برای داشتن نتیجه نهایی، این Query رو اجرا میکنیم:

SELECT COUNT(OrderID) as 'Count' ,dbo.myfunc('1996-07-04',Orderdate,10) as 'Period' FROM Orders GROUP BY dbo.myfunc('1996-07-04',Orderdate,10)
ORDER BY dbo.myfunc('1996-07-04',Orderdate,10)
این تابع رو میتونین Customize کنین تا قابلیتهای بیشتری به شما بده.
موفق باشید..

SReza1
شنبه 27 فروردین 1384, 16:25 عصر
ایده فوق العاده‌ای بود.
:kaf: من در SQL server 2000 کار میکنم که امکان استفاده از group by با روشی که شما گفته بودید وجود ندارد ولی به کمک جدولهای Temp و روش شما کارمو انجام دادم. ان شاء الله 2005 رو نصب میکنم.

AminSobati
یک شنبه 28 فروردین 1384, 00:25 صبح
موفق باشین :)