PDA

View Full Version : کجای این دستورم ایراد داره



nilo_nazanin
سه شنبه 22 آذر 1390, 19:40 عصر
سلام دوستان خوبید من ایتن کدو مینوسم ارور زیرو میده
میشه منو راهنمایی کنین ، tabale Grade از نوع varchre10 هستش و من این کدو مینویسم

select
stno , sum(grade) / count (stno) as 'Average'


from grade


group BY stno


having stno>10
go
و این ارور

Msg 8117, Level 16, State 1, Line 2

Operand data type varchar is invalid for sum operator.

یوسف زالی
سه شنبه 22 آذر 1390, 20:18 عصر
سلام.اولا که برای معدل گیری دستور AVG وجود داره و نیازی به اون کار نیست.
دوما شما که نمی تونی یک رشته رو در sum بیاری. باید یک فیلد از اون رو که عددی هست بیاری. اگر مطمئن هستی که همیشه در اون عدد نگهداری میشه از تبدیل نوع استفاده کن.
select sum(cast(field as int)) as S
سوما برای الیاس فیلدهات لازم نیست که اون رو بین کوتیشن بگذاری.
در آخر هم بهتره که نام فیلدهای یک جدول همنام با خود جدول نباشه.
موفق باشی.

tazarvmmr
چهارشنبه 23 آذر 1390, 01:09 صبح
Operand data type varchar is invalid for sum operator.


سلام
جواب شما رو توی پست اول دادند! شما توجه نکردید، این پیام خطا نشون میده که نوع داده فیلدی که شما دارید ازش در تابع Sum استفاده میکنید از نوع varchar هستش! این یعنی که شما دارید جمع ردیفهای ستونی رو محاسبه میکنید که از جنس عدد نیستند!

ضمنا راهی که شما برای محاسبه میانگین انتخاب کردید راه معقولی نیست، چون تابعی برای این کار در T-SQL وجود داره و با استفاده از اون تابع نیاز نیست شما جمع کل رو بر تعداد تقسیم کنید.

حالا کتابی که شما دارید ازش صحبت میکنید یا اشتباه نوشته و یا شما اشتباه نوشتید.

ضمنا برای اینکه به راحتی بتونید کدهای SQL رو داخل پستهاتون بزارید نیاز نیست اینقدر به خودتون سختی بدید! کافیه اونرو داخل تگ SQL قرار بدید.

nilo_nazanin
پنج شنبه 24 آذر 1390, 21:05 عصر
از شما دوست عزیزم سپاسگزارم کاملا حق با شماست
تبدیل به اینت که کردم درست شد
ببخشید من چطور میتونم دیتابیسی که دارم که شامل جدولهای مختلفی است را جابجا کنم ؟ چگئنه سیو کردن و انتقال منظورم ایت
با تشکر

tazarvmmr
پنج شنبه 24 آذر 1390, 21:51 عصر
از شما دوست عزیزم سپاسگزارم کاملا حق با شماست
تبدیل به اینت که کردم درست شد
ببخشید من چطور میتونم دیتابیسی که دارم که شامل جدولهای مختلفی است را جابجا کنم ؟ چگئنه سیو کردن و انتقال منظورم ایت
با تشکر

اگر میخواین که اطلاعات هم باهاش منتقل بشه بهترین راه اینه که یک Back up ازش بگیرید و در مقصد Restore کنید، ولی اگر فقط میخواین دیتابیس رو بدون اطلاعات منتقل کنید باید ازش یک اسکریپت بسازین و در مقصد مثل یک کوئری اجراش کنین.

nilo_nazanin
جمعه 25 آذر 1390, 15:52 عصر
سپاس
اما چگونه ؟ هر دو منظورم هست هم فایل mdf و هم بک آپ گیری و هم restore
ممنونم

tazarvmmr
جمعه 25 آذر 1390, 21:20 عصر
وقتی Backup بگیریدو Restore کنین، یا Script رو اجرا کنین فایل mdf خود بخود ایجاد میشه، شما وقتی یک دیتابیس بسازید حتی بدون جدول اون فایل mdf ساخته میشه

یک راه دیگه هم هست و اون اینکه فایلهای mdf , ldf رو روی کامپیوتر مقصد کپی کنین و عمل Attach Database رو انجام بدین! البته در این حالت باید SQL Server سرویسش اجرا نباشه، چون اجازه کپی کردن این فایلها رو بهتون نمیده

nilo_nazanin
شنبه 26 آذر 1390, 00:04 صبح
SELECT



s.stno , lname , fname , grade , unit ,name


INTO Qrrr


FROM Grade g ,Student s , Course c


WHERE s.Stno>'15'and s.stno=g.stno and c.courseno=g.courseno


SELECT*


FROM Qrrr

GO




با تشکر میشه واسم توضیح بدید ، بعد از AND رو نمیفهمم چیکار کرده
و فروم رو چرا تک کاراکتر گزاشته آخه ؟
ممنون میشم عزیزان

tazarvmmr
شنبه 26 آذر 1390, 01:20 صبح
خوب، به نظر نمیاد اشکالی داشته باشه! مگر اینکه توی Where مشکل بگیره اونم بخاطر نوع داده ها.

این دستور یک table بنام Qrrr میسازه و ردیفهایی رو که شامل شرط مندرج در Where میشن رو اونتو میریزه.

در حقیقت داده ها از سه تا Table به نامهای Grade, Student و Course انتخاب میشن، توی From داره میگه که جدول Grade رو بنام g در نظر بگیره و جدول Student رو بنام S و جدول Course رو به اسم c فرض کنه و همونطوری که میبینید توی Select اول داره از این اسامی استفاده میکنه یعنی در حقیقت s.stno فیلد stno از جدولStudents هستش.
اون Select و From آخر هم داره هر چیزی که توی کوئری بالا به جدول Qrrr منتقل شده رو براتون نمایش میده، یعنی یک Select ساده از جدول جدیدی که با اجرای دستورات بالایی ساخته شده.

حالا اگر به شما ارور میده باید بگید چه اروری میده تا بشه گفت که اشکال در کجاست، ولی بدون هیچ شکی شما باید سه تا جدول Students, Course و Grade رو در بانکتون داشته باشید و فیلدهایی که اشاره شده هم در این جداول وجود داشته باشند.

البته یک چیزی که الان دیدم! lname, fname, grade, unit و name هم باید بگید که از کدوم جدولها هستن، دقیقا مشابه s.stno که با عبارت .s مشخص شده که از جدول s (که همون student هست) فراخوانی میشه.

اون عبارت From رو میتونه اینطوری هم نوشته بشه:


From Students as s, Course as c, Grade as g

nilo_nazanin
شنبه 26 آذر 1390, 13:44 عصر
با سپاس از دوست عزیز که زحمت بنده بر دوش شما افتده است
این کوئری مشکلی نداشت و کاملا صحیح ران میشه ، مشکل بنده در تفهیم
From Students as s, Course as c, Grade as g
این بود که متوجه شدم ، اما لزومشو نه !
با سپاس

nilo_nazanin
یک شنبه 27 آذر 1390, 22:10 عصر
SELECT

SUM(Grade) AS 'Jam' , AVG(Grade) AS 'Miangin'


FROM GRADE


SELECT Grade


FROM Grade

GO

سلام دوستان راه ساده تر این چیه ؟
من میخوام نمراتو تو یه ستون نشون بده ، میانگین هم تو یه ستون و جمع هم تو یه ستتون
راه بهتری قطعا هس میشه راهنمای کنین

tazarvmmr
چهارشنبه 30 آذر 1390, 01:13 صبح
سلام
به نظرم سوالتون ابهام داره! وقتی شما یک ستون بنام Grade دارید، قاعدتا در هر ردیف یک مقدار وجود داره پس جمعش و میاگینش در حقیقت خودشه!!! این سوال شما موقعی مفهوم پیدا میکنه که یک ستون دیگری مثلا بنام کد دانشجویی وجود داشته باشه و نمرات متعددی برای هر دانشجو در جدول وجود داشته باشه و شما بخواین حالا جمع و میانگین نمرات یک دانشجو رو و خود نمرات رو نشون بدید!
پس لطفا اگر من اشتباه حدس زدم منو تصحیح کنین و اگر اینطوری که من گفتم هستش سوالتون رو کامل بیان کنین

nilo_nazanin
چهارشنبه 30 آذر 1390, 11:04 صبح
سلام
مرسی از توجهتون

ببینین یه جدول دارم به نامه Grade که یه فیلد داره به Grade من میخوام کوئیری بنویسم که اول نمرات grade رو نشون بده ، ثانیا همه این نمراتو جمع کنه ، و میانگینشو با جمع grade / بر تعداد نشن بذه ، دقیقا چیزی که در ک.ئری بالاست ، اما من در یک جدول میخوام
امیدوارم تونسه باشم منظورمو برسونم
با تشکر

tazarvmmr
چهارشنبه 30 آذر 1390, 20:00 عصر
من راهی به نظرم نمیرسه

nilo_nazanin
پنج شنبه 01 دی 1390, 15:59 عصر
سپاس از شما

بوسیله GROUP BY هم نمیشه کاریش کرد؟

tazarvmmr
پنج شنبه 01 دی 1390, 16:07 عصر
بوسیله Group by تمام ردیفها رو نشون نمیده، مثلا اگر یک فیلد به اسم StudentId داشته باشید و آخر کوئری بنویسید Group by studentId اونوقت جمع و میانگین Grade رو برای ردیفهایی که studentId یکسان داشته باشند بر میگردونه

nilo_nazanin
پنج شنبه 01 دی 1390, 16:17 عصر
اها که اینطور سپاس از شما ، جالبه که راهی نداره .

tazarvmmr
پنج شنبه 01 دی 1390, 16:48 عصر
من نگفتم راهی نداره! ممکنه داشته باشه! من اطلاعی ندارم! شاید دوستان دیگه راه بلد باشن و بگن
منتها مطمعن هستم که اگر باشه راه ساده ای نیست

این لینک (http://barnamenevis.org/showthread.php?317741-%D8%AC%D9%85%D8%B9-%D9%85%D9%82%D8%A7%D8%AF%DB%8C%D8%B1-%DB%8C%DA%A9-%D8%B3%D8%AA%D9%88%D9%86)رو هم یک نگاهی بندازید