PDA

View Full Version : خطا در کوئری دارای Group By



Bita.Jo
سه شنبه 16 آبان 1391, 09:51 صبح
سلام خدمت دوستان عزیز
من یک کوئری میخوام که با توجه به مقدار یک فیلد جمع یک فیلد دیگر را برگرداند بصورت زیر بدون شرط است و مشکلی نیست اما وقتی شرط میذارم خطا میده:
بدون شرط
Select Count(id), Sum(Prc1), id from Table1 group by id
با شرط که خطا میده

Select Count(id) , Case when T=1 then Sum(Prc1) when T=2 then Sum(Prc2) else Sum(Prc3) end
id from Table1 Group by id

خطای زیر را می دهد
Column 'Table1.T' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

من میخوام با توجه به مقدار فیلدT مجموع Prc1,2,3 را برگردانم و همیشه یک مقدار نیست میدونم که نباید تو کوئری که Count داره از فیلدهای بجز اون استفاده تکی کنم ولی الان هم من نمیخوام مقادیر رو تک تک ببینم و فقط دارم توی شرط از فیلد T استفاده میکنم
کسی میتونه راه حلی برای مشکلم بگه؟؟؟؟؟؟؟؟؟؟؟؟؟؟:ناراحت:

حمیدرضاصادقیان
سه شنبه 16 آبان 1391, 11:32 صبح
سلام.
چون شما دارید بر روی فیلد T شرط اعمال میکنید و این فیلد نیز در عملیات محاسباتی شرکت نکرده باید حتما در قسمت Group by این فیلد قید شود.
در غیر اینصورت میتوانید با استفاده از CTE این دستور رو بازنویسی کنید.

Bita.Jo
سه شنبه 16 آبان 1391, 11:51 صبح
ممنون از توجه شما
من نمی تونم فیلد T رو در Group By بیاورم چون باید یک ستون جمع براساس id داشته باشم و فقط با توجه به T ،ستون جمع در هر رکورد تفاوت میکند من روش CTE رو نمیدونم میشه بیشتر توضیح بدید حتی خواستم از Function استفاده کنم ولی نمیدونستم چطوری بنویسم که جوابمو بده

حمیدرضاصادقیان
سه شنبه 16 آبان 1391, 12:55 عصر
این یک روش هست.

SELECT COUNT(ID),ID,(SELECT SUM(prc1) FROM table1 t1
WHERE t=1 AND t1.id=table1.id
) AS Sum1
,(SELECT SUM(Prc2) FROM Table1 t1
WHERE t=2 AND t1.ID=table1.id
) AS Sum2
FROM Table1
GROUP BY Id


البته روشهای دیگه ای هم وجود داره که میتونید روی این موضوع تحقیق کنید.

Bita.Jo
پنج شنبه 18 آبان 1391, 10:26 صبح
با سلام مجدد
ممنون از راهنمایی قبلی مشکل شرط حل شدو
مشکلی که من الان دارم روی کوئری جاری جهت جمع مقادیر بدست آمده است که مجموع آنها را بدلیل اینکه هربار T یکی از مقادیر 1تا 3 را دارد Null برمیگرداند کوئری را بصورت زیر بازنویسی کردم ونمیتوانم شرط برای بررسی مقادیر غیر از Null بگذارم

Select Count(id), (SELECT SUM(Y1) FROM Table1 WHERE T=1) + (SELECT SUM(Y2) FROM Table1 WHERE T=2) + (SELECT SUM(Y3) FROM Table1 WHERE T=3) as SumTotal , id from Table1 group by id
اگر هرکدام از Select ها بدلیل عدم تطابق با شرط Tمقدار Null برگرداند مجموع Null میشود . من میخواهم این سطر به جای Null مقدار صفر بگیرد که بتوان آنها را باهم جمع کرد

حمیدرضاصادقیان
پنج شنبه 18 آبان 1391, 10:35 صبح
باید از تابع Isnull استفاده کنید.
به این شکل


Select Count(id),
(SELECT isnull(SUM(Y1),0) FROM Table1 WHERE T=1)
+ (SELECT isnull(SUM(Y2),0) FROM Table1 WHERE T=2)
+ (SELECT isnull(SUM(Y3),0) FROM Table1 WHERE T=3) as SumTotal , id from Table1 group by id