ورود

View Full Version : سوال: مشکل با group by



zahra111
سه شنبه 29 اردیبهشت 1388, 16:04 عصر
select name,city from T_user group by city

من وقتی دستور بالا رو اجرا می کنم این error رو می ده. علتش چیه؟

Column ' T_user.name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

pooyamirzapour
سه شنبه 29 اردیبهشت 1388, 16:44 عصر
باید تمام فیلدهای سلکت رو تو گروپ بای بیاری
select name,city from T_user group by name, city

zahra111
سه شنبه 29 اردیبهشت 1388, 20:09 عصر
باید تمام فیلدهای سلکت رو تو گروپ بای بیاری
select name,city from T_user group by name, city

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

amin_alexi
چهارشنبه 30 اردیبهشت 1388, 09:26 صبح
سلام

لطف می کنید منطقش رو توضیح بدین. وقتی می خوام بر اساس نام گروه بندی کنه چرا باید اسم تمام فیلدها رو بیارم؟
اول یک سوال Group By چه کاری انجام میده !؟
جواب : تمام کسانی رو که در یک مقداری که Group By قراره روی اون فیلد انجام بشه گروه بندی می کنه !
مثلا با توجه به Query شما (select city from T_user group by city) بدون فیل name وقتی میخواین بر اساس شهر Group By بزنید تمام کسانی که در شهر تهران هستند در یک گروت و اصفهانی ها در یک گروه و ... حالا شما تو خروجی چی می بینید
تهران
اصفهان
.
.
حالا اگه جلوی Select فیلد نام بیاد به نظر شما در خروجی نام کدوم یکی از افراد بیاد !؟
مثلا اگه اصغر و جواد و تقی در اصفهان باشند اسنم کدومشون باید در جلوی نام اصفهان باشه !
علت اینه که SQL اون Error رو به شما میده !

zahra111
جمعه 01 خرداد 1388, 11:50 صبح
من با کدی که شما گفتین تست کردم اما نتیجه ی اون با نتیجه دستور select name,city from T_user هیچ فرقی نداره.

حامد مصافی
جمعه 01 خرداد 1388, 12:52 عصر
نبایدم فرقی داشته باشد. چون داده ها را از یک جدول استخراج می کنید. کاربرد GROUP BY در مورد جداول master-detail است.


اگر لیست city را می خواهید:


select distinct city from T_user

amin_alexi
شنبه 02 خرداد 1388, 02:10 صبح
من با کدی که شما گفتین تست کردم اما نتیجه ی اون با نتیجه دستور select name,city from T_user هیچ فرقی نداره.
به احتمال زیاد هم نباید فرق می کرد !
امیدوارم توضیحات منو خوب خونده باشید ! یک بار دیگه Post شماره 4 رو بخونبد تا منطق Group by رو یاد بگیرین چیه ... اگه سوالی داشتین بپرسین
شما بگین چه خروجی مد نظرتونه تا من بیشتر راهنمایی کنم ...


نبایدم فرقی داشته باشد. چون داده ها را از یک جدول استخراج می کنید. کاربرد GROUP BY در مورد جداول master-detail است.
نه دوست عزیز
اصلا هم این طور نیست ! یعنی به هیچ عنوان ...
Group By چه ربطی به master-detail داره ! :متفکر:
یعنی نمیشه Group by رو روی یک جدول زد :متعجب:
... هر چی فکر می کنم نمی دونم با چه چیزی اشتباه گرفتی که این جمله رو نوشتی !

zahra111
شنبه 02 خرداد 1388, 10:56 صبح
منظورم یه چیزی مشابه عکس ضمیمه است.

pesar irooni
شنبه 02 خرداد 1388, 12:05 عصر
به نظر من اینکاری که شما گفتی با Order By انجام بدی خیلی بهتره. مثلا کد زیر رو روی Northwind انجام بده

select Country,CustomerID from customers
Order By Country
فوقش شهرها هی تکرار میشند. اما اگه بخوای شهر فقط یه بار بیاد و فیلدهاش تا شهر بعدی Null باشه بازم راه داره که البته کوئری زمانبر تر و پیچیده تری رو شامل خواهد شد.

zahra111
شنبه 02 خرداد 1388, 12:47 عصر
به نظر من اینکاری که شما گفتی با Order By انجام بدی خیلی بهتره. مثلا کد زیر رو روی Northwind انجام بده

select Country,CustomerID from customers
Order By Country
فوقش شهرها هی تکرار میشند. اما اگه بخوای شهر فقط یه بار بیاد و فیلدهاش تا شهر بعدی Null باشه بازم راه داره که البته کوئری زمانبر تر و پیچیده تری رو شامل خواهد شد.

من می خوام اسم شهرها تکرار نشه. مثل عکس ضمیمه ای که دادم.

sentimental
شنبه 02 خرداد 1388, 13:29 عصر
در حالتی می توان از GROUP BY استفاده کرد که یک تابع AGREEGATE روی تک تک رکورد های
یک فیلد اجرا شود.

حامد مصافی
شنبه 02 خرداد 1388, 17:07 عصر
یعنی نمیشه Group by رو روی یک جدول زد
خیر، چون مجموعه فیلد های یک جدول (رکورد) یک کلید دارند، پس تنظیم مجدد کلید بی فایده خواهد بود، لذا مانند کاری که این دوست انجام داده اند تاثیری در خروجی نخواهد داشت و فقط اندکی سربار اضافی بر سیستم تحمیل خواهد کرد.

@ zahra111 (http://barnamenevis.org/forum/member.php?u=77268) :
سناریوی درخواستی شما ایراد دارد. می خواهید city ها تکراری نباشد. اگر همراه در city چند name در جدول وارد شده باشد آنگاه کدام یک از این name ها باید نمایش داده شود؟
مثال :
در جدول زیر کدام یک از city ها باید همراه با n1 استخراج شود؟

name city
---------------------------
n1 c1
n2 c1
n3 c1
n4 c2
n5 c3

amin_alexi
شنبه 02 خرداد 1388, 17:31 عصر
یعنی نمیشه Group by رو روی یک جدول زد خیر، چون مجموعه فیلد های یک جدول (رکورد) یک کلید دارند، پس تنظیم مجدد کلید بی فایده خواهد بود، لذا مانند کاری که این دوست انجام داده اند تاثیری در خروجی نخواهد داشت و فقط اندکی سربار اضافی بر سیستم تحمیل خواهد کرد.

بله اگه Group By روی کلید اصلی باشه حق با شماست !
ولی ایشون روی کلید اصلی Group By نکردند !
بازم می گی نمیشه روی یک جدول Group by زد ؟!!!
خواهشن این جمله رو به صورت عمومی به کار نبر ...
در صورتی Group By نتیجه نمیده که روی کلید اصلی باشه ...
در همین جدول Group By City چه جوابی میده !
میشه دوست عزیز :چشمک: حتی نیم درصد هم شک نکن !

حامد مصافی
شنبه 02 خرداد 1388, 17:51 عصر
میشه دوست عزیز :چشمک: حتی نیم درصد هم شک نکن !
شما نباید با من بحث کنید. دوست عزیزی که این سوال را فرمودند دنبال همین مطلب هستند. لطف کنید سناریوی ایشان را پیاده کنید، بدین ترتیب من هم پی به این نکته میبرم که میشه!

zahra111
شنبه 02 خرداد 1388, 18:09 عصر
در حالتی می توان از GROUP BY استفاده کرد که یک تابع AGREEGATE روی تک تک رکورد های
یک فیلد اجرا شود.

میشه بیشتر در مورد این تابع توضیح بدین؟

zahra111
شنبه 02 خرداد 1388, 18:13 عصر
خیر، چون مجموعه فیلد های یک جدول (رکورد) یک کلید دارند، پس تنظیم مجدد کلید بی فایده خواهد بود، لذا مانند کاری که این دوست انجام داده اند تاثیری در خروجی نخواهد داشت و فقط اندکی سربار اضافی بر سیستم تحمیل خواهد کرد.

@ zahra111 (http://barnamenevis.org/forum/member.php?u=77268) :
سناریوی درخواستی شما ایراد دارد. می خواهید city ها تکراری نباشد. اگر همراه در city چند name در جدول وارد شده باشد آنگاه کدام یک از این name ها باید نمایش داده شود؟
مثال :
در جدول زیر کدام یک از city ها باید همراه با n1 استخراج شود؟

name city
---------------------------
n1 c1
n2 c1
n3 c1
n4 c2
n5 c3
یعنی همچین چیزی قابل پیاده سازی نیست؟ با کمک زبان های برنامه نویسی مثل #C چطور؟

حامد مصافی
شنبه 02 خرداد 1388, 18:27 عصر
یعنی همچین چیزی قابل پیاده سازی نیست؟ با کمک زبان های برنامه نویسی مثل #C چطور؟
قبلاً گفتم، سناریوی درخواستی شما ایراد دارد. لطف کنید مسئله مورد نظر خود را با جزئیات شرح دهید. احتمالاً راه حل شما چیز دیگریست.

sentimental
شنبه 02 خرداد 1388, 22:08 عصر
میشه بیشتر در مورد این تابع توضیح بدین؟
Agreegate Functions یا توابع دسته جمعی.
دلیل نام گذاری این توابع به نام دسته جمعی به این دلیل است که برای یک مقدار بی ارزش هستند.
بعضی از این توابع به صورت زیر است:

COUNT()
SUM()
MAX()
MIN()

amin_alexi
یک شنبه 03 خرداد 1388, 09:20 صبح
یعنی همچین چیزی قابل پیاده سازی نیست؟ با کمک زبان های برنامه نویسی مثل #C چطور؟
این چیزی که شما می خواین با یک Sort ساده و Distinct قابل پیاده سازیه !

select Distinct city, name from T_user Order by city, name
اما نمیشه دقیقا به اون صورت که می خوای در بیاری !
مگر اینکه با یک حلقه و Cursor به شکلی که می خوای در بیاری و یا راحتتر اینکه در زبان برنامه نویسی مثل C# این کار رو انجام بدی !
و اما !

شما نباید با من بحث کنید. دوست عزیزی که این سوال را فرمودند دنبال همین مطلب هستند. لطف کنید سناریوی ایشان را پیاده کنید، بدین ترتیب من هم پی به این نکته میبرم که میشه!
من جواب این دوست عزیز و شما رو دادم !
اول شما !
من گفتم با این جمله که شما به صورت عمومی به کار می برین و میگین Group By برای یک جدول نیست و برای جداول Master - Detail به کار می ره مخالفم ! برای حرف خودم دلیل آوردم و کامل توضیح دادم ولی شما فقط میگین نمیشه ! بدون هیچ دلیل منطقی !
این شخصی که سوال رو مطرح کرد با Group by مشکل داشت که علت رو گفتم و در ادامه هم خروجی رو گفت چی میخواد که بازم راهنمایی کردم !
اگه هنوز هم قانع نشدید که میشه روی یک جدول Group by زد بگین تا بحث کنیم !:چشمک:

Hamid.Mayeli
یک شنبه 03 خرداد 1388, 09:37 صبح
این چیزی که شما می خواین با یک Sort ساده و Distinct قابل پیاده سازیه !

select Distinct city, name from T_user Order by city, name
اما نمیشه دقیقا به اون صورت که می خوای در بیاری !
مگر اینکه با یک حلقه و Cursor به شکلی که می خوای در بیاری و یا راحتتر اینکه در زبان برنامه نویسی مثل C# این کار رو انجام بدی !
و اما !

من جواب این دوست عزیز و شما رو دادم !
اول شما !
من گفتم با این جمله که شما به صورت عمومی به کار می برین و میگین Group By برای یک جدول نیست و برای جداول Master - Detail به کار می ره مخالفم ! برای حرف خودم دلیل آوردم و کامل توضیح دادم ولی شما فقط میگین نمیشه ! بدون هیچ دلیل منطقی !
این شخصی که سوال رو مطرح کرد با Group by مشکل داشت که علت رو گفتم و در ادامه هم خروجی رو گفت چی میخواد که بازم راهنمایی کردم !
اگه هنوز هم قانع نشدید که میشه روی یک جدول Group by زد بگین تا بحث کنیم !:چشمک:


Group By هیچ ربطی به Master - Detail نداره شاید بخواهی Sum یا Count یا از این قبیل کارهارو بکنی مثلا

select City, Count(*) From t-User Group by City

amin_alexi
یک شنبه 03 خرداد 1388, 09:53 صبح
Group By هیچ ربطی به Master - Detail ندارهخوب خدا رو شکر یکی حرف ما رو تایید کرد !

Hamid.Mayeli
یک شنبه 03 خرداد 1388, 10:05 صبح
خوب خدا رو شکر یکی حرف ما رو تایید کرد !

شما کارت درسته مخصوصا در باره Identity:تشویق:

حامد مصافی
یک شنبه 03 خرداد 1388, 10:16 صبح
GROUP BY در نمای استخراج شده یک (یا چند) فیلد با به عنوان کلیک خروجی معین می کند. لذا فیلد (های) انتخاب شده فقط یک بار در خروجی نمایش داده می شوند. در این مثال این دوست عزیز نیاز به دو فیلد از یک جدول دارند. لذا باید هر دو فیلد را به ناچار در عبارت GROUP BY ذکر کنند، در این حالت خروجی با به کارگیری پرس و جو بون عبارت GROUP BY تفاوتی نخواهد داشت.

من گفتم با این جمله که شما به صومن گفتم با این جمله که شما به صورت عمومی به کار می برین و میگین Group By برای یک جدول نیست و برای جداول Master - Detail به کار می ره مخالفم ! برای حرف خودم دلیل آوردم و کامل توضیح دادم ولی شما فقط میگین نمیشه ! بدون هیچ دلیل منطقی !
این شخصی که سوال رو مطرح کرد با Group by مشکل داشت که علت رو گفتم و در ادامه هم خروجی رو گفت چی میخواد که بازم راهنمایی کردم !

اما راهکار عملی برای جواب ایشان ارائه نکردید.

فرموده Hamid.Mayeli (http://barnamenevis.org/forum/member.php?u=102571) یک نمونه از پیاده سازی روی یک جدول است. اما Count(*) یک جزئیات از پرس و جوی ماست، به همین دلیل در عبارت GROUP BY ذکر نشده است. اما درخواست دوست عزیز ما در مورد استخراج دو فیلد از یک جدول به شکلی که فرمودند ممکن نیست، چون متن سوال ایشان مشکل دارد.

Hamid.Mayeli
یک شنبه 03 خرداد 1388, 10:31 صبح
GROUP BY در نمای استخراج شده یک (یا چند) فیلد با به عنوان کلیک خروجی معین می کند. لذا فیلد (های) انتخاب شده فقط یک بار در خروجی نمایش داده می شوند. در این مثال این دوست عزیز نیاز به دو فیلد از یک جدول دارند. لذا باید هر دو فیلد را به ناچار در عبارت GROUP BY ذکر کنند، در این حالت خروجی با به کارگیری پرس و جو بون عبارت GROUP BY تفاوتی نخواهد داشت.

اما راهکار عملی برای جواب ایشان ارائه نکردید.

فرموده Hamid.Mayeli (http://barnamenevis.org/forum/member.php?u=102571) یک نمونه از پیاده سازی روی یک جدول است. اما Count(*) یک جزئیات از پرس و جوی ماست، به همین دلیل در عبارت GROUP BY ذکر نشده است. اما درخواست دوست عزیز ما در مورد استخراج دو فیلد از یک جدول به شکلی که فرمودند ممکن نیست، چون متن سوال ایشان مشکل دارد.

دوستان قبلا اشاره کردن که باد از ابزار های گزارش گیری استفاده کنن. حق با شماست BlackDal

amin_alexi
یک شنبه 03 خرداد 1388, 10:54 صبح
اما راهکار عملی برای جواب ایشان ارائه نکردید.
گفتم که تو C# یا با Cursor میتونه این کار رو شبیه سازی کنه و یا به قول دوستمون در ابزارهای گزارش سازی !

فرموده Hamid.Mayeli (http://barnamenevis.org/forum/member.php?u=102571) یک نمونه از پیاده سازی روی یک جدول است. اما Count(*) یک جزئیات از پرس و جوی ماست، به همین دلیل در عبارت GROUP BY ذکر نشده است. اما درخواست دوست عزیز ما در مورد استخراج دو فیلد از یک جدول به شکلی که فرمودند ممکن نیست، چون متن سوال ایشان مشکل دارد.
بله این در خواسن به این شکل ممکن نیست !
حالا چون این در خواست به این شکل رو نمیشه با دستورات ساده . بدون Cursor یا While انجام داد ما نباید یک قانون کلی رو مطرح کنیم و موجب گمراهی بشیم !

چون داده ها را از یک جدول استخراج می کنید. کاربرد GROUP BY در مورد جداول master-detail است.

amin_alexi
یک شنبه 03 خرداد 1388, 11:01 صبح
نمی دونستم این رو کجا بدم که Hamid.Mayeli (http://barnamenevis.org/forum/member.php?u=102571) بتونه ببینه !
دوست عزیز Hamid.Mayeli (http://barnamenevis.org/forum/member.php?u=102571) من جواب پیغام نتونستم بدن چون نشد و این پیغام رو به من داد !

Hamid.Mayeli has chosen not to receive private messages or may not be allowed to receive private messages. Therefore you may not send your message to him/her.

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

pesar irooni
یک شنبه 03 خرداد 1388, 14:35 عصر
این کد همون کاری رو که شما میخواهید انجام میده (یک نوع کلک رشتیه)

use NorthWind
go
select
'row'= Identity(int,1,1),country,CustomerID
Into #TEMP
from customers as e
order by country asc
-----------------------
select b.country,a.CustomerID from
(select * from #temp) as a
left outer join
(select min(row)as row,country from #temp
group by country) as b
on a.country = b.country and a.row = b.row
اما من اگه جای شما بودم از همون order by استفاده میکردم. واقعا نمیدونم چه عملی روی این داده ها میخواهید انجام بدید که با مدل قبلی نمیتونستید.

Hamid.Mayeli
یک شنبه 03 خرداد 1388, 14:44 عصر
این کد همون کاری رو که شما میخواهید انجام میده (یک نوع کلک رشتیه)

use NorthWind
go
select
'row'= Identity(int,1,1),country,CustomerID
Into #TEMP
from customers as e
order by country asc
-----------------------
select b.country,a.CustomerID from
(select * from #temp) as a
left outer join
(select min(row)as row,country from #temp
group by country) as b
on a.country = b.country and a.row = b.row
اما من اگه جای شما بودم از همون order by استفاده میکردم. واقعا نمیدونم چه عملی روی این داده ها میخواهید انجام بدید که با مدل قبلی نمیتونستید.


این یه راهی دیگه!!!!!!
فقط یه Drop تهش میزاشتی که بتونه بیش از یک بار باهاش کار کنه.


use NorthWind
go
select
'row'= Identity(int,1,1),country,CustomerID
Into #TEMP
from customers as e
order by country asc
-----------------------
select b.country,a.CustomerID from
(select * from #temp) as a
left outer join
(select min(row)as row,country from #temp
group by country) as b
on a.country = b.country and a.row = b.row

Drop Table #Temp

و اگه از SPID کمک بگیری میتونی تو شبکه هم باهاش کار کنی؟:متفکر::کف:

zahra111
سه شنبه 05 خرداد 1388, 23:32 عصر
از همه دوستان ممنونم. پس همچین چیزی امکان ندره.