PDA

View Full Version : Query



حمیدرضاصادقیان
چهارشنبه 22 شهریور 1385, 09:23 صبح
سلام دوستان.من یک Query به شکل زیر نوشتم.



Select substring(Pt.date1,4,2) as [month],Po.code_k,sum(po.gty) as Tedad,Pa.rdfanbar
from P_anbar Pa
inner join P_oriz1 Po on pa.rdfanbar=Po.rdfanbar and Pa.cod_k=Po.Code_k and Pa.cod_v=Po.code_v
inner join p_otpt pt on pt.code=po.code
group by Po.code_k,Pa.rdfanbar,substring(Pt.date1,4,2)
order by code_k,[month]

حالا کار این query چیه؟
ببینید در این کوئری من جمع فروشهای کالاهای مختلف رو در هرماه بدست اوردم.
مثلا فکر کنید کالای x در ماههای 5و6و7 فروش داشته است. با این query همه اونها رو براساس ماه به من نشون میده.
حالا مشکل اینجاست که این query برای هر ماه یک ردیف در نظر میگیره .یعنی من میخوام هرکالایی رو یک بار بیاره و اگر در هر ماهی هم فروش داشت یک فیلدی در نظر بگیره و در اون عدد جمع در اون ماه رو بنویسه.در اصل نمیخوام برای هرماه بیاد یک ردیف در نظر بگیره.
الان صورت شکل a1 است که میخوام به شکل a2 باشه.

حالا باید چه جوری به این شکل تنظیمش کنم؟

البته ناگفته نمونه که من این شکل ماهها رو در خود دلفی درست کردم ولی به همون شکل بالاست که برای هر ماه یک ردیف هست.میخوام مثل شکل دوم باشه.



with ADOQuery1 do
begin
i:=fieldbyname('month').Value;
case i of
01:fieldbyname('m1').value:=fieldbyname('tedad').v alue;
02:fieldbyname('m2').value:=fieldbyname('tedad').v alue;
03:fieldbyname('m3').value:=fieldbyname('tedad').v alue;
04:fieldbyname('M4').value:=fieldbyname('tedad').v alue;
05:fieldbyname('m5').value:=fieldbyname('tedad').v alue;
06:fieldbyname('m6').value:=fieldbyname('tedad').v alue;
07:fieldbyname('m7').value:=fieldbyname('tedad').v alue;
08:fieldbyname('m8').value:=fieldbyname('tedad').v alue;
09:fieldbyname('m9').value:=fieldbyname('tedad').v alue;
10:fieldbyname('m10').value:=fieldbyname('tedad'). value;
11:fieldbyname('m11').value:=fieldbyname('tedad'). value;
12:fieldbyname('m12').value:=fieldbyname('tedad'). value;
end;
end;


این هم درست کردن شکل ماهها که درست شده ولی اگر یک کالا در چند ماه فروش داشته باشه چند بار کالا رو تکرار میکنه که میخوام در یک ردیف در هرماهی که فروش داشته در ستون مربوطه اونو بنویسه.

ghabil
چهارشنبه 22 شهریور 1385, 10:09 صبح
یک تابع تعریف کن تو دیتابیست که یک پارامتر بگیره (پارامتر ماه) اونوقت مجموع فروش اون ماه رو بده (بدنه تابعت خیلی شبیه همین کدی که نوشتی میشه احتمالا) بعد یک چیزی اینطوری
میشه


Select Select GetMonthSum(1), Select GetMonthSum(2), .. from ...

حمیدرضاصادقیان
چهارشنبه 29 شهریور 1385, 09:03 صبح
خوب دوست عزیز این که شما میگی درسته.ولی مشکل اینه که من میخوام نام کالا و کد کالا و نام واحد اونو برگردونم که تابع من باید یک جدول برگردونه که نمیشه از دستور select شما استفاده کرد.
الان بدنه تابع من کد زیر است.



CREATE FUNCTION Sefaresh (@m1 int,@m2 int,@m3 int,@m4 int)
RETURNS @sefaresh Table (code_k varchar(13),Tedad decimal(28,3),Rdf smallint,mo varchar(5))
AS
BEGIN
insert @sefaresh
Select Po.code_k,sum(po.gty) as Tedad,Pa.rdfanbar as rdfanbar,substring(Pt.date1,4,2) as [month]
from P_anbar Pa
inner join P_oriz1 Po on pa.rdfanbar=Po.rdfanbar and Pa.cod_k=Po.Code_k and Pa.cod_v=Po.code_v
inner join p_otpt pt on pt.code=po.code
where substring(Pt.date1,4,2)=@m1 or substring(Pt.date1,4,2)=@m2 or substring(Pt.date1,4,2)=@m3 or substring(Pt.date1,4,2)=@m4
group by Po.code_k,Pa.rdfanbar,substring(Pt.date1,4,2)
order by code_k

return
END

ghabil
پنج شنبه 30 شهریور 1385, 03:09 صبح
خوب دوست عزیز این که شما میگی درسته.ولی مشکل اینه که من میخوام نام کالا و کد کالا و نام واحد اونو برگردونم که تابع من باید یک جدول برگردونه که نمیشه از دستور select شما استفاده کرد.


چرا نمیشه ؟! ببین یک چیزی میشه مثلا اینطوری :


Select KalaName, KalaId , ..., GetMonthSum(KalaID, 1), GetMonthSum(KalaID,2),... From KALATABLE


حالا این تابع GetMonthSum باید مقدار فروش کالایی که بهش پاس میشه رو در ماهی که بهش پاس میشه بدست بیاره ....