ورود

View Full Version : جمع یک فیلد از یک query اجرا شده



hamid-nic
پنج شنبه 19 شهریور 1388, 15:19 عصر
سلام دوستان
من با یک query اطلاعات چند جدول را بر حسب نیاز کنارهم میارم . یکی از فیلد های این query مبلغ است که من نیاز دارم جمع این فیلد را بدست آورم چون query را با دستور where محدود کردم نیاز دارم جمع فیلد را فقط از اطلاعاتی که از query بر می گرداند بدست آورم
از این دستور استفاده کردم



SELECT SUM(pool) AS SumPrice FROM Mainfish
اما این دستور مستقیما به بانک رفته تمام اطلاعات جدول را بر می گرداند و هیچ توجهی به query و محدودیت های where ندارد
یعنی می خواهم در query ایجاد شده با محدودیت هایش یک ستون اضافه بشه و جمع یک فیلد از همان query را به ما بدهد یا راهی دیگر . . .
هر بار query تقریبا بین 300 تا 600 رکورد را بر می گرداند .
از sql server 2000 و دلفی 7 استفاده می کنم .
دوستان راهنمایی کنید چکار کنم .

vcldeveloper
پنج شنبه 19 شهریور 1388, 16:50 عصر
من که توی کد شما WHERE ایی برای محدود کردن نتیجه کوئری نمی بینیم. انتظار دارید بدون اینکه WHERE را در کد بالا قرار بدید، SQL Server خودش متوجه بشه که منظور شما همه رکوردهای جدول نیست؟!

hamid-nic
پنج شنبه 19 شهریور 1388, 21:10 عصر
من که توی کد شما WHERE ایی برای محدود کردن نتیجه کوئری نمی بینیم. انتظار دارید بدون اینکه WHERE را در کد بالا قرار بدید، SQL Server خودش متوجه بشه که منظور شما همه رکوردهای جدول نیست؟!

ببخشید این کد کوئری نبود من فقط قسمت مربوط به sum را قرار داده بودم کد اصلی این است ::اشتباه:



SELECT MainInf.code, MainFish.sal, MainInf.name, MainInf.Family,MainInf.nameFather, MainInf.WorkTime, ReshtehHa.reshteh, KhabgahHa.Namekh,
MainFish.data, MainFish.fish, MainFish.pool, MainFish.tozih
FROM MainFish INNER JOIN
ReshtehHa INNER JOIN
MainInf ON ReshtehHa.ID = MainInf.reshteh INNER JOIN
KhabgahHa INNER JOIN
MainKh ON KhabgahHa.ID = MainKh.numkh ON MainInf.code = MainKh.code ON MainFish.code = MainInf.code AND MainFish.sal = MainKh.sal
WHERE (MainFish.sal ='''+combobox3.Text+''' )And (MainInf.WorkTime ='''+combobox4.Text+''')And(KhabgahHa.Namekh ='''+combobox2.Text+''') '



از کامپوننت sdac استفاده کردم .
که همانطور که مشخص است با where محدود شده است و کوئری بدرستی کار خود را انجام می دهد .
حالا من می خواهم در این کوئری جمع یکی از فیلد ها به نام MainFish.pool را بدست آورم .

vcldeveloper
پنج شنبه 19 شهریور 1388, 22:32 عصر
حالا من می خواهم در این کوئری جمع یکی از فیلد ها به نام MainFish.pool را بدست آورم .
خب عبارت SUM(MainFish.Pool) as SumPrice را به لیست فیلدهای کوئری (بعد از SELECT) اضافه کنید.

hamid-nic
پنج شنبه 19 شهریور 1388, 22:58 عصر
خب عبارت SUM(MainFish.Pool) as SumPrice را به لیست فیلدهای کوئری (بعد از SELECT) اضافه کنید.
آقای کشاورز این کار را انجام دادم جواب نداد به این صورت اضافه کردم



SELECT MainInf.code, MainFish.sal, MainInf.name, MainInf.Family, MainInf.nameFather, MainInf.WorkTime, ReshtehHa.reshteh, KhabgahHa.Namekh,
MainFish.data, MainFish.fish, MainFish.pool, MainFish.tozih,SUM(MainFish.Pool) as SumPrice
.
.
.


تمام کل کوئری را خطا می گیره !!!

hamid-nic
جمعه 20 شهریور 1388, 12:51 عصر
دوستان کسی تا حالا به این مشکل بر نخورده !!!
من عبارت sum را در کوئری اضافه کردم اما کوئری دیگر اجرا نمی شود و خطای نامفهوم بودن جملات کوئری را می دهد !!!!!

hamid-nic
جمعه 20 شهریور 1388, 23:02 عصر
دوستان مثل اینکه تاپیک را انتقال دادند به اینجا !!!!!!!!!!!!!!!!!!:متعجب:
خوب به هرحال کسی می تونه کمکی کنه ! :ناراحت::افسرده:

hamid-nic
شنبه 21 شهریور 1388, 20:45 عصر
کسی توی این تالار کمک ما نمی کنه ؟!!!!!!!!!!!!!!!!!!:افسرده:

محمد سلیم آبادی
شنبه 21 شهریور 1388, 20:50 عصر
بدون Group by می خواهید از تابع Sum استفاده کنید؟
متن خطایی را که می دهد را ارسال کنید.

hamid-nic
شنبه 21 شهریور 1388, 21:28 عصر
بدون Group by می خواهید از تابع Sum استفاده کنید؟
متن خطایی را که می دهد را ارسال کنید.
ممنون از اینکه جواب دادید.
من از کد زیر استفاده می کنم :



SELECT SUM(MainFish.pool) AS kol,MainInf.code, MainFish.sal, MainInf.name, MainInf.Family, MainInf.nameFather, MainInf.WorkTime, ReshtehHa.reshteh, KhabgahHa.Namekh,
MainFish.data, MainFish.fish, MainFish.pool, MainFish.tozih
FROM MainFish INNER JOIN
ReshtehHa INNER JOIN
MainInf ON ReshtehHa.ID = MainInf.reshteh INNER JOIN
KhabgahHa INNER JOIN
MainKh ON KhabgahHa.ID = MainKh.numkh ON MainInf.code = MainKh.code ON MainFish.code = MainInf.code AND MainFish.sal = MainKh.sal




البته این قسمت را هم موقع استفاده در برنامه به کد اضافه می کنم :


WHERE (MainFish.sal ='''+combobox3.Text+''' )And (MainInf.WorkTime ='''+combobox4.Text+''')And(KhabgahHa.Namekh ='''+combobox2.Text+''') '

خطایی را هم که میدهد :



Server: Msg 8118, Level 16, State 1, Line 1
Column 'MainInf.code' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
Server: Msg 8118, Level 16, State 1, Line 1
Column 'MainFish.sal' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
Server: Msg 8118, Level 16, State 1, Line 1
Column 'MainInf.name' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
Server: Msg 8118, Level 16, State 1, Line 1
Column 'MainInf.Family' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
Server: Msg 8118, Level 16, State 1, Line 1
Column 'MainInf.nameFather' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
Server: Msg 8118, Level 16, State 1, Line 1
Column 'MainInf.WorkTime' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
Server: Msg 8118, Level 16, State 1, Line 1
Column 'ReshtehHa.reshteh' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
Server: Msg 8118, Level 16, State 1, Line 1
Column 'KhabgahHa.Namekh' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
Server: Msg 8118, Level 16, State 1, Line 1
Column 'MainFish.data' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
Server: Msg 8118, Level 16, State 1, Line 1
Column 'MainFish.fish' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
Server: Msg 8118, Level 16, State 1, Line 1
Column 'MainFish.pool' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
Server: Msg 8118, Level 16, State 1, Line 1
Column 'MainFish.tozih' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.



از SQL Query Analyzer استفاده کردم .

محمد سلیم آبادی
شنبه 21 شهریور 1388, 21:52 عصر
جمله ی زیر ویرایش شده است:
پیش بینی می کردم این پیغام را بدهد، هنگامی که از یک تابع Aggregate مثل sum/max/avg/count استفاده می شود باید ستون های دیگر نیز با استفاده از این توابع آورده شوند یا اگر group by استفاده کردید تنها ستون های موجود در group by می توانند مستقیم (یعنی بدون استفاده از این گونه توابع) استفاده شوند.


اصلا معلوم نیست هدفتان از این کار چیست.
لطفا دقیقا مشخص کنید که چه هدفی از ساخت این کوئری دارید، چه ستونهایی می خواهید به نمایش در آید و ...
مثلا خنده دار است هم می خواهم جمع کل پول را داشته باشید و هم خود پول!!

ولی من جدی هستم، این کوئری را اجرا کنید ببینید باز هم پیغام خطا می دهد یا خیر.


/*
SELECT D.kol
,MainInf.code
, MainFish.sal
, MainInf.name
, MainInf.Family
, MainInf.nameFather
, MainInf.WorkTime
, ReshtehHa.reshteh
, KhabgahHa.Namekh
, MainFish.data
, MainFish.fish
, MainFish.[pool]
, MainFish.tozih

FROM MainFish
INNER JOIN ReshtehHa
INNER JOIN MainInf ON ReshtehHa.ID = MainInf.reshteh
INNER JOIN KhabgahHa
INNER JOIN MainKh
ON KhabgahHa.ID = MainKh.numkh
ON MainInf.code = MainKh.code
ON MainFish.code = MainInf.code AND MainFish.sal = MainKh.sal
INNER JOIN
(
select code
,SUM([pool]) AS kol
from MainFish
)D
ON MainFish.code=D.code
*/

hamid-nic
شنبه 21 شهریور 1388, 22:15 عصر
پیش بینی می کردم این پیغام را بدهد، طبیعی است توابع aggregate روی یک مجموعه ی داده ها مورد استفاده قرار می گیردند ولی اینجا خبری از مجموعه نیست.
اصلا معلوم نیست هدفتان از این کار چیست.
لطفا دقیقا مشخص کنید که چه هدفی از ساخت این کوئری دارید، چه ستونهایی می خواهید به نمایش در آید و ...
مثلا خنده دار است هم می خواهم جمع کل پول را داشته باشید و هم خود پول!!

ولی من جدی هستم، این کوئری را اجرا کنید ببینید باز هم پیغام خطا می دهد یا خیر.



/*
SELECT D.kol
,MainInf.code
, MainFish.sal
, MainInf.name
, MainInf.Family
, MainInf.nameFather
, MainInf.WorkTime
, ReshtehHa.reshteh
, KhabgahHa.Namekh
, MainFish.data
, MainFish.fish
, MainFish.[pool]
, MainFish.tozih

FROM MainFish
INNER JOIN ReshtehHa
INNER JOIN MainInf ON ReshtehHa.ID = MainInf.reshteh
INNER JOIN KhabgahHa
INNER JOIN MainKh
ON KhabgahHa.ID = MainKh.numkh
ON MainInf.code = MainKh.code
ON MainFish.code = MainInf.code AND MainFish.sal = MainKh.sal
INNER JOIN
(
select code
,SUM([pool]) AS kol
from MainFish
)D
ON MainFish.code=D.code


*/



اولا ممنون از اینکه واقعا پیگیر مسئله می شوید !! :خجالت:
من یک جدول کلی برای اطلاعات شخصی افراد دارم به نام mainInf شامل نام ، نام خانوادگی و... و یک جدول هم دارم برای اطلاعات مالی به نام MainFish شامل شماره فیش پرداختی ، تاریخ پرداخت ، مبلغ پرداخت ، توضیحات پرداخت و یک جدول هم دارم برای ثبت اطلاعات خوابگاه دانشجویی به نام Mainkh شامل نام خوابگاه و نام اتاق که کلا همه اینها را بهم وصل کردم تا یک کوئری شبیه این در بیاید . هدف من از این کار این است که موقعی که کاربر با توجه به اطلاعات وارد شده در قسمت where کد یک سری نتایج را محدود می کند جمع کل مبلغ این افراد موجود در کوئری را بدست آورم و این تنها از روی فیلدی است که در کوئری به نام pool وجود دارد . من دستور sum را برای جدول MainFish اجرا کردم اما نتایج جمع را برای کل رکورد های موجود می دهد در صورتی که من می خواهم عده ای که در کوئری وجود دارند جمع فیلد پول پرداختی شان را بدست آورم . امید وارم متوجه منظورم شده باشید .
کدتان را هم اجرا کردم خطای زیر را می هد :



Server: Msg 8118, Level 16, State 1, Line 1
Column 'MainFish.code' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.

محمد سلیم آبادی
شنبه 21 شهریور 1388, 22:42 عصر
ببینید قرار نیست تمام ستون های موجود در تمام جداول در خروجی به نمایش در بیایند، وقتی که از ماده ی Group BY استفاده می شود در واقع تنها ستونهایی می توانند در خروجی به نمایش در بیایند که در لیست Group By قرار گرفته باشند.



SELECT SUM(MainFish.pool) AS kol
,MainInf.code
, MainInf.name
, MainInf.Family
, ReshtehHa.reshteh
, KhabgahHa.Namekh

FROM MainFish
INNER JOIN ReshtehHa
INNER JOIN MainInf ON ReshtehHa.ID = MainInf.reshteh
INNER JOIN KhabgahHa
INNER JOIN MainKh
ON KhabgahHa.ID = MainKh.numkh
ON MainInf.code = MainKh.code
ON MainFish.code = MainInf.code AND MainFish.sal = MainKh.sal

GROUP BY MainInf.code
, MainInf.name
, MainInf.Family
, ReshtehHa.reshteh
, KhabgahHa.Namekh

hamid-nic
شنبه 21 شهریور 1388, 22:59 عصر
ببینید قرار نیست تمام ستون های موجود در تمام جداول در خروجی به نمایش در بیایند، وقتی که از ماده ی Group BY استفاده می شود در واقع تنها ستونهایی می توانند در خروجی به نمایش در بیایند که در لیست Group By قرار گرفته باشند.



SELECT SUM(MainFish.pool) AS kol
,MainInf.code
, MainInf.name
, MainInf.Family
, ReshtehHa.reshteh
, KhabgahHa.Namekh

FROM MainFish
INNER JOIN ReshtehHa
INNER JOIN MainInf ON ReshtehHa.ID = MainInf.reshteh
INNER JOIN KhabgahHa
INNER JOIN MainKh
ON KhabgahHa.ID = MainKh.numkh
ON MainInf.code = MainKh.code
ON MainFish.code = MainInf.code AND MainFish.sal = MainKh.sal

GROUP BY MainInf.code
, MainInf.name
, MainInf.Family
, ReshtehHa.reshteh
, KhabgahHa.Namekh





msalim عزیز از کدت خیلی ممونم جواب داد ولی من منظورم چیز دیگه ای است .
با یک مثال ساده منظورم را می رسانم ببینید شما توی دیتابیستون یک جدولی دارید شامل نام ، نام خانوادگی ، مبلغ
وقتی می خواهید جمع کد این مبلغ ها را حساب کنید فرضا 500 تا رکورد دارید از تابع sum به این شکل استفاده می کنید :



SELECT SUM(pool) AS SumPrice FROM my table

این تابع جمع کل این رکورد ها را بدست می آورد . حالا اگر این جدول تبدیل به یک کوئری شود چی ؟ یعنی بخواهیم جمع یک فیلد از یک کوئری را بدست آوریم ؟ اون وقت باید چکار کینم ؟ حتما هم قرار نیست این کد مربوط به قسمت sum ترکیبی با کوئری اصلی باشد . اصلا به هر نحوی که بشود جمع این فیلد از این کوئری را بدست آورد ؟
یاد آوری اینکه هر بار کوئری تعداد 300 تا 600 رکورد را بر می گرداند .
بازم از اینکه راهنمایی می کنید ممونم .

محمد سلیم آبادی
شنبه 21 شهریور 1388, 23:10 عصر
ببینید اگر منظورتون از کوئری این است که تابع sum تنها روی سطرهای مورد نظر از جدول اعمال شود دو راه وجود دارد یک راه این است که از Derived table استفاده کنید، در ضمن شما وقتی WHERE را به Query آخری که پست کردم در واقع کار فیلتر کردن را نیز انجام خواهید داد.
به مثال زیر توجه کنید (نگران نباش هر سوالی داشتی پست کنید من تا فردا صبح روی صندلی های تالار خواهم نشست و به پست های شما جواب خواهم داد:لبخندساده:)



SELECT SUM(pool) AS SumPrice
FROM my_table
WHERE 1=1--Some Condition

SELECT SUM(pool) AS SumPrice
FROM
(
SELECT pool
FROM my_table
WHERE 1=1--Some Condition
)D

hamid-nic
شنبه 21 شهریور 1388, 23:29 عصر
ببینید اگر منظورتون از کوئری این است که تابع sum تنها روی سطرهای مورد نظر از جدول اعمال شود دو راه وجود دارد یک راه این است که از Derived table استفاده کنید، در ضمن شما وقتی WHERE را به Query آخری که پست کردم در واقع کار فیلتر کردن را نیز انجام خواهید داد.
به مثال زیر توجه کنید (نگران نباش هر سوالی داشتی پست کنید من تا فردا صبح روی صندلی های تالار خواهم نشست و به پست های شما جواب خواهم داد:لبخندساده:)



SELECT SUM(pool) AS SumPrice
FROM my_table
WHERE 1=1--Some Condition

SELECT SUM(pool) AS SumPrice
FROM
(
SELECT pool
FROM my_table
WHERE 1=1--Some Condition
)D





توی این مدتی که من عضو این سایت شدم تا حالا کسی را مثل شما ندیدم که اینقدر پشتکار داشته و مسائل را پیگیری کند واقعا جای تقدیر و قدردانی دارد .
اما مشکل مون :
ببینید چطوری میشه در کد زیر به جای my_table از یک کوئری نام برد که این کار را در کوئری انجام دهد و فیلد pool یکی از فیلد های کوئری باشد .



SELECT SUM(pool) AS SumPrice
FROM my_table

محمد سلیم آبادی
شنبه 21 شهریور 1388, 23:51 عصر
سلام،
یک کاری می کنیم اینگار مشکل نمی خواهد حل شود!

نکته 1: "چطوری می شود به جای نام جدول از یک کوئری نام برد (نقل قول:پست شده توسط شما)"
یعنی نام یک Query را قرار دهیم، سوال اینجاست مگه Query نام دارد؟

نکته 2: اطلاعات شما در زمینه Querying چه اندازه است؟ آیا با VIEW ، Derived Table ، Subquery ، CTE آشنا هستید؟
احساس می کنم دنبال کلمه ای می گردید ولی آن را پیدا نکردید و به جای آن از کوئری استفاده میکنید، شاید کلمه ی مورد نظر شما VIEW باشد!

نکته 3:لطفا پست هایتان را بدون نقل قول ارسال کنید، مگر غیر از بنده در این تاپیک کسی هم مساله را دنبال می کند.

نتکته 4: بعدا ارسال خواهم کرد (:

hamid-nic
یک شنبه 22 شهریور 1388, 00:01 صبح
ببینید منظورمن از Query یک جدول فرضی است که هر فیلد آن را از یک جدول دیگر گرفته است .
مثلا ما 5 تا جدول داریم .
یک کوئری تعریف (تشکیل) می کنیم و از هر جدول یک فیلد را بر می داریم (با رعایت فیلد های کلیدی و نوع طراحی دیتابیس مون)
در واقع الان ما یک کوئری داریم که دارای 5 تا فیلد است که تمام این فیلدها را از 5 تا جدول دیگر گرفته است .
منظورم از Query این بود .

محمد سلیم آبادی
یک شنبه 22 شهریور 1388, 00:04 صبح
هنگامی می توانم همکاری لازم را انجام دهم که جواب گویی دو طرفه باشد، شما به طور کامل به سوالات بنده جواب ندادید!!
احساس می کنم اطلاعاتتان در مورد QUERY مناسب نیست.
این چیزی را که می خواهید در پست شماره ی 15 قرار داده ام.
لطفا یک سری به پیام های خصوصی خود به زنید.
سوالتان کلی است یعنی دنبال یک روش می گردید یا اینکه می خواهید یک مساله ای که وجود خارجی دارد را حل کنید؟

محمد سلیم آبادی
یک شنبه 22 شهریور 1388, 01:34 صبح
کدتان را هم اجرا کردم خطای زیر را می هد :



Server: Msg 8118, Level 16, State 1, Line 1
Column 'MainFish.code' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.




یادم رفت که در جدول مشتق شده ی D در انتها، کد زیر را قرار دهم

GROUP BY code

hamid-nic
دوشنبه 23 شهریور 1388, 18:53 عصر
سلام msalim عزیز
شرمنده از اینکه پاسخ گویی دیر شد
رشته ی تحصیلی من برق و الکترونیک است و مثل شما که رشته ی اصلی تون کامپیوتر است نیست در نتیجه من با یک سری مطالبی که شما آشنایی دارید ندارم چون من تمام چیزهایی را که در زمینه برنامه نویسی یاد گرفتم بصورت مطالعه ، مشاهده سورس ، پرسش از دوستان و . . . بوده است . در نتیجه نیاز به کمک و راهنمایی شما دارم . در زمینه هایی هم که گفتید خیلی کم مطالبی بلدم .
خوب حالا مشکل را چیکار کنیم .