PDA

View Full Version : خطا در استفاده از دستور Group By



behnam-soft
سه شنبه 06 خرداد 1393, 15:34 عصر
سلام دوستان
من یه کوئری نوشتم که وقتی اون رو در برای یه جدول اجرا می کنم، بدون مشکلی اجرا میشه و داده های صحیح رو بر می گردونه، اما وقتی می خوام چندتا جدول رو بهم از طریق دستور INEER JION ربط بدم، خطا میگیره، ممنون میشم راهنمایی کنین، اینم کدی که نوشتم :
create proc tblinforShowYearsMoney
@roosta_id int,
@sal int
as
select tblshahrestan.shahrestan,tblbakhsh.bakhsh,tblroost a.roostaname,
tblinfor.sal,sum(tblinfor.sakhteman_Dehyari),sum(t blinfor.Atashneshani),
sum(tblinfor.Faza_sabz),sum(tblinfor.Gorestan),sum (tblinfor.Farhangi),
sum(tblinfor.Quran),sum(tblinfor.maaber),sum(tblin for.Pasmand),
sum(tblinfor.eshteghal),sum(tblinfor.bodge),sum(tb linfor.jam)
from tblshahrestan inner join tblbakhsh on tblshahrestan.id=tblbakhsh.id_sh
inner join tblroosta on tblbakhsh.id=tblroosta.id_b inner join tblinfor
on tblroosta.roosta_id=tblinfor.roosta_id
where tblinfor.roosta_id=@roosta_id and tblinfor.sal=@sal
group by tblinfor.roosta_id
اینم خطایی که میگیره :
Msg 8120, Level 16, State 1, Procedure tblinforShowYearsMoney, Line 5
Column 'tblshahrestan.shahrestan' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

مشکل چیه دقیقا ؟

sohil_ww
سه شنبه 06 خرداد 1393, 16:01 عصر
یه تعداد از فیلدات تتو گروپ بای نیستن و Sql Server این گروپ قبول نمی کنه برای این کار باید اون فیلد هارو تو کوئریتم بیاری تو قسمت گروپ بای برای مثال می شه
group by tblinfor.roosta_id,tblshahrestan.shahrestan,tblbak hsh.bakhsh
البته خوب متقابلا مقداریم که میاره جابجا می شه بعنی بر اساس تمام فیلد ها گروپ می زنه
:گریه: اینم به در خواست خواهر دوستم زدم که ببینه این شکلکا رو می زنم چی می شه

behnam-soft
سه شنبه 06 خرداد 1393, 16:04 عصر
خسته نباشی واقعا !

behnam-soft
سه شنبه 06 خرداد 1393, 16:57 عصر
دوستان ازاین کد هم که استفاده می کنم:
select (select tblshahrestan.shahrestan,tblbakhsh.bakhsh,tblroost a.roostaname from tblshahrestan inner join
tblbakhsh on tblshahrestan.id=tblbakhsh.id_sh inner join tblroosta on tblbakhsh.id=tblroosta.id_b
where tblroosta.id='355'),
sum(tblinfor.sakhteman_Dehyari),sum(tblinfor.Atash neshani),
sum(tblinfor.Faza_sabz),sum(tblinfor.Gorestan),sum (tblinfor.Farhangi),
sum(tblinfor.Quran),sum(tblinfor.maaber),sum(tblin for.Pasmand),
sum(tblinfor.eshteghal),sum(tblinfor.bodge),sum(tb linfor.jam)
from (tblshahrestan inner join tblbakhsh on tblshahrestan.id=tblbakhsh.id_sh
inner join tblroosta on tblbakhsh.id=tblroosta.id_b inner join tblinfor
on tblroosta.roosta_id=tblinfor.roosta_id)
where tblinfor.roosta_id='355' and tblinfor.sal='1392'
group by tblinfor.roosta_id


این خطا رومیده :
Msg 116, Level 16, State 1, Line 1
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

sohil_ww
سه شنبه 06 خرداد 1393, 17:15 عصر
اینم خطایی که میگیره :
Msg 8120, Level 16, State 1, Procedure tblinforShowYearsMoney, Line 5
Column 'tblshahrestan.shahrestan' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

مشکل چیه دقیقا ؟

دوست عزیز شما گفتی مشکل چیه نگفتی که کویری چی کار کنم تا درست بشه
من خودم وقتی می خوام اینجوری گروپ بای بزنم میام از MaxDistinct استفاده می کنم البته راه درستی شاید نباشه
بهنام جان من اینو می گم چون دوست دارم کمکت کنم شایدم جواب اصولی نباشه ولی پاسخ می ده
شاید سطح علمی شما از من خیلی بالاتر باشه ولی من فقط می خواستم مشکلی که قبلا خودمم بهش گیر کرده بودم و کمکت کنم

behnam-soft
چهارشنبه 07 خرداد 1393, 19:26 عصر
دوست عزیز شما گفتی مشکل چیه نگفتی که کویری چی کار کنم تا درست بشه
من خودم وقتی می خوام اینجوری گروپ بای بزنم میام از MaxDistinct استفاده می کنم البته راه درستی شاید نباشه
بهنام جان من اینو می گم چون دوست دارم کمکت کنم شایدم جواب اصولی نباشه ولی پاسخ می ده
شاید سطح علمی شما از من خیلی بالاتر باشه ولی من فقط می خواستم مشکلی که قبلا خودمم بهش گیر کرده بودم و کمکت کنم
دوست من ضمن سپاس از وقتی که گذاشتی و پاسخ دادی، باید بگم اون جمله خسته نباشی که گفتم منظورم به جمله آخری بود که در پست قبلش نوشته بودی!
این MaxDistinct که میگی دقیقا نمی دونم چه کارمیکنه اما با یه ترفندی تونستم مشکلم رو حل کنم، البته یه کمی صورت مساله رو هم تغییر دادم، در غیر اینصورت مشکل هنوز کماکان به قوت خودش باقیه ! اما،دریغ از شرکت دوستان (جز شما)!

sohil_ww
چهارشنبه 07 خرداد 1393, 20:16 عصر
بهنام من این سئوال قبلا پرسیدم خودم خیلی دنبالش گشتم ولی بعد امد از مکس استفاده کردم تا حلش کنم یعنی به عبارطی فیلد های که می خواستم تو گروپ نباشن از maxdistincit استفاده می کردم سئوال کامل توضیح بده ببینم می شه با max زد

یوسف زالی
چهارشنبه 07 خرداد 1393, 21:56 عصر
سلام.
مسلما باید هم ایراد بگیره.
گروه بندی رو بر اساس چیزی انجام می ده که بهش گفته می شه. حالا اگر فیلدی در لیست گروه نیست، یا از توابع تجمیعی استفاده نشده، ایراد خواهد گرفت.
راه حل:
می تونید از CTE استفاده کرده و نتیجه کوئری اولیه رو قبل از join در اون بریزید، بعد حاصل رو join کنید.
می تونید با استفاده از پرانتز سلکتتون رو به یک جدول موقتی تبدیل کنید و حاصل رو join کنید.
می تونید لیست فیلد های دیگه رو در گروه بندی ذکر کنید...

behnam-soft
پنج شنبه 08 خرداد 1393, 19:18 عصر
ببین دوست من، من یه جدول برای شهر دارم، یه جدول برای بخش که کلید خارجیش، کلید اصلی جدول شهرها هست، یه جدول هم برای روستاها که کلید خارجیش کلید اصلی هر بخش هست، یه جدول هم که یه سری اطلاعات راجع به روستاها داره که کلید خارجیش، کلید اصلی جدول روستا ها هست، خب، برای نشون دادن اطلاعات یه روستا میام کد اون روستا رو از جدول روستا با Inner Join بر می دارم، اسم بخشی که روستا در اون هست رو هم با Inner Join کردن با جدول بخش در میارم، و در نهایت اسم شهرستان رو هم از جدول شهرستان با Inner Join بدست میارم، این کل کاریه که من می کنم.در حالت عادی و بدون استفاه از دستور گروپ بای، همه چیز خوب پیش میره و اطلاعات به درستی به نمایش در میان، اما زمانی که از گروپ بای استفاده می کنم،به همون مشکلی که گفتم بر می خورم !

behnam-soft
پنج شنبه 08 خرداد 1393, 19:20 عصر
سلام.
مسلما باید هم ایراد بگیره.
گروه بندی رو بر اساس چیزی انجام می ده که بهش گفته می شه. حالا اگر فیلدی در لیست گروه نیست، یا از توابع تجمیعی استفاده نشده، ایراد خواهد گرفت.
راه حل:
می تونید از CTE استفاده کرده و نتیجه کوئری اولیه رو قبل از join در اون بریزید، بعد حاصل رو join کنید.
می تونید با استفاده از پرانتز سلکتتون رو به یک جدول موقتی تبدیل کنید و حاصل رو join کنید.
می تونید لیست فیلد های دیگه رو در گروه بندی ذکر کنید...
ضمن تشکر ازپاسخ شما، یه کمیش رو متوجه شدم اما با کد نمی تونم درش بیارم، ممنون میشم در صورت امکان، منظورتون رو با استفاده از کد، بیان کنین.

یوسف زالی
پنج شنبه 08 خرداد 1393, 20:51 عصر
with CTE as (
select a, b, max(c)
from tbl1
group by a, b
)
select *
from CTE
join Tbl2 on a = id