PDA

View Full Version : میانگین یک فیلد به ازای تمام مقادیر ارسال شده به یک پارامتر



mehrnaz_ss
پنج شنبه 01 اردیبهشت 1390, 22:05 عصر
سلام
من می خوام یک گزارش بگیرم به این صورت که هم برای یک محصول و هم برای تمام محصولات خروجی به صورت :

کمپانی ، میانگین کل

داشته باشه، یک پارامتر ProductId@ برای ارسال آیدی محصول مورد نطر تعریف کردم و کوئری به ازای یک محصول کار می کنه .
حالا مشکلم اینه که برای محاسبه تمام محصولات فرمولش اینه که برای هر محصول مجزا میانگین کل را حساب کنم و نتایجی که به دست میاد رو با هم جمع کنم و تقسیم بر تعداد محصولات کنم.
میشه لطفا راهنمایی کنید که چیکار کنم؟

محمد سلیم آبادی
پنج شنبه 01 اردیبهشت 1390, 22:43 عصر
سلام،
توضیحاتتون برای ایجاد یک پاسخ دقیق کافی نیست. نیاز هست که یک مثال عملی ارائه بدین.
ولی برای مورد دوم که میانگین کلی را می خواهین بدست بیارین از طریق زیر می تونید عمل کنید:

select avg(average_per_group) as average
from
(
select grp, avg(value)
from TableName
group by grp
) D (grp, average_per_group);

mehrnaz_ss
شنبه 03 اردیبهشت 1390, 02:08 صبح
مرسی که جواب دادید ولی فکر می کنم نتونستم منظورمو درست برسونم.

ALTERProcedure [dbo].[po_SalesActual_Report]
@Year INT,
@Month VARCHAR(50),
@ProductID INT

AS
Begin
SELECT (V.A-V.B)/V.C AS average,
V.CompanyID,
V.AvgFalle,
V.AvgKise25k,
V.AvgKise50k,
V.AvgJambo
from
(
کوئری که بر اساس @productId کار می کند
)AS v
END


این برای یک @productId هست حالا اگر بخوام برای تمام productId که در جدول product هستند average رو حساب کنم باید به ازای هر productId میانگین رو حساب کنم بعد از کلش میانگین بگیرم. مشکل من دقیقا اینه میشه لطفا راهنمایی کنید؟

حمیدرضاصادقیان
شنبه 03 اردیبهشت 1390, 12:19 عصر
سلام.
شما باید مقداری دستورتون رو Dynamic بنویسید. بهتره اول کنترل کنید مثلا اگر Productid برابر صفر بود در کوئری دوم دیگه پارامترProductId رو پاس ندید و در غیر اینصورت بهش مقدار بدید.
مثال :



ALTERProcedure [dbo].[po_SalesActual_Report]

@Year INT,

@Month VARCHAR(50),

@ProductID INT



AS

Begin
Declare @Str Varchar(1000)

Set @Str=' SELECT (V.A-V.B)/V.C AS average,V.CompanyID,V.AvgFalle,V.AvgKise25k,V.AvgK ise50k,

V.AvgJambo

from '
If @ProductId=0
Set @Str=@Str+'
(
Query Without @ProductId
)AS v'
Else
Set @Str=@Str+' (

Query with @ProductID value
)AS v'
exec(@Str)
END

محمد سلیم آبادی
دوشنبه 05 اردیبهشت 1390, 19:57 عصر
>>
این برای یک @productId هست حالا اگر بخوام برای تمام productId که در جدول product هستند average رو حساب کنم باید به ازای هر productId میانگین رو حساب کنم بعد از کلش میانگین بگیرم. مشکل من دقیقا اینه میشه لطفا راهنمایی کنید؟
<<

با این فرض که موقع میانگین گیری کلی مقدار پارامتر productid@ رو Null در نظر می گیرد می تونید این کار رو انجام بدین:

Select total_averge
From (select average_per_group
From t
Where product_id = @product_id
Or @product_id is null
Group by product_id
)d


این کوئری در صورتی که متغیر مقداری غیر از null داشته باشد product_id ها رو فیلتر میکنه و در نهایت میانگین محصول مورد نظر رو بدست میاره. و اگر هم Null باشه ابتدا میانگین به ازای هر محصول را جداگانه محاسبه و در آخر نیز میانگین کلی را بدست میاره.
از اونجایی که کوئری کامل رو ارسال نکردین من مجبور شدم یک کوئری نمونه ارسال کنم.