View Full Version : نحوه بدست آوردن تعداد مقدار درج شده در رکوردها
mustafaehsani
جمعه 03 خرداد 1392, 20:33 عصر
با سلام خدمت اساتید محترم
شاید عنوان سوالم گیج کننده باشه من با استفاده از کوئری زیر
SELECT dbo.Teacher.*, dbo.Credit.CName, dbo.Evaluation.*
FROM dbo.Student INNER JOIN
dbo.Evaluation ON dbo.Student.SID = dbo.Evaluation.SttID INNER JOIN
dbo.Syllabus ON dbo.Student.SID = dbo.Syllabus.[Student ID] AND dbo.Evaluation.syllID = dbo.Syllabus.SyID INNER JOIN
dbo.Credit ON dbo.Syllabus.[Credit ID] = dbo.Credit.CID INNER JOIN
dbo.Teacher ON dbo.Syllabus.[Teacher ID] = dbo.Teacher.TID
where dbo.Teacher.TID=1130
و نتیجه زیر رو بدست میارم
104623
حالا میخوام تعداد رکوردهایی که مقدارش برابر با 5 بدست بیارم
tooraj_azizi_1035
جمعه 03 خرداد 1392, 20:48 عصر
کوئری تون رو تغییر بدید:
ادامه WHERE:
where dbo.Teacher.TID=1130 AND Q1=5 AND Q2=5...
ابتدای SELECT :
SELECT Count(*) AS Qty, dbo.Teacher.*, dbo.Credit.CName, dbo.Evaluation.*
mustafaehsani
شنبه 04 خرداد 1392, 08:41 صبح
کوئری تون رو تغییر بدید:
ادامه WHERE:
where dbo.Teacher.TID=1130 AND Q1=5 AND Q2=5...
ابتدای SELECT :
SELECT Count(*) AS Qty, dbo.Teacher.*, dbo.Credit.CName, dbo.Evaluation.*
eror زیر رو میده
Msg 8120, Level 16, State 1, Line 1
Column 'dbo.Teacher.TID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Salah Sanjabian
شنبه 04 خرداد 1392, 11:45 صبح
سلام به گروه یندی گیر میده اینو تست کن
SELECT distinct Count(*) over() AS Qty, dbo.Teacher.*, dbo.Credit.CName, dbo.Evaluation.*
mustafaehsani
شنبه 04 خرداد 1392, 12:21 عصر
شرمنده ها ولی من هیچکدوم از اینا کارمو راه ننداخت میخوام به من تعداد مثلاً 300 رکورد داخلش عدد 5 درج شده دقیقا کاری که count if در excel انجام میده
Salah Sanjabian
شنبه 04 خرداد 1392, 16:56 عصر
یعنی چی داخلش عدد 5 باشه؟کدوم فیلد یا ستون توش عدد 5 باشه؟
mustafaehsani
شنبه 04 خرداد 1392, 18:53 عصر
یعنی چی داخلش عدد 5 باشه؟کدوم فیلد یا ستون توش عدد 5 باشه؟
ببخشید که همیشه سوالم بد عنوان میکنم. من میخوام به من تعداد بده یعنی بگه توی 300 رکورد عدد 5 درج شده نه توی هر خونه ای که عدد 5 درج شده رو select کنه دقیقا count if در excel انجام میده یعنی میگه توی رکوردها select شده 300 تا عدد 5 هست یا 100 تا عدد 4 هست
محمد سلیم آبادی
شنبه 04 خرداد 1392, 19:06 عصر
میتونید یک نمونه داده ساده و نتیجه مورد نظر را پست کنید تا بشه فهمید دقیقا چه خروجی مد نظرتون هست؟
tooraj_azizi_1035
شنبه 04 خرداد 1392, 20:20 عصر
SELECT Count(*) AS Qty From
(
SELECT dbo.Teacher.*, dbo.Credit.CName, dbo.Evaluation.*
FROM dbo.Student INNER JOIN
dbo.Evaluation ON dbo.Student.SID = dbo.Evaluation.SttID INNER JOIN
dbo.Syllabus ON dbo.Student.SID = dbo.Syllabus.[Student ID]
AND dbo.Evaluation.syllID = dbo.Syllabus.SyID INNER JOIN
dbo.Credit ON dbo.Syllabus.[Credit ID] = dbo.Credit.CID INNER JOIN
dbo.Teacher ON dbo.Syllabus.[Teacher ID] = dbo.Teacher.TID
where dbo.Teacher.TID=1130 AND Q1=5 AND Q2=5...)
محمد سلیم آبادی
شنبه 04 خرداد 1392, 20:54 عصر
SELECT Count(*) AS Qty From
(
SELECT dbo.Teacher.*, dbo.Credit.CName, dbo.Evaluation.*
FROM dbo.Student INNER JOIN
dbo.Evaluation ON dbo.Student.SID = dbo.Evaluation.SttID INNER JOIN
dbo.Syllabus ON dbo.Student.SID = dbo.Syllabus.[Student ID]
AND dbo.Evaluation.syllID = dbo.Syllabus.SyID INNER JOIN
dbo.Credit ON dbo.Syllabus.[Credit ID] = dbo.Credit.CID INNER JOIN
dbo.Teacher ON dbo.Syllabus.[Teacher ID] = dbo.Teacher.TID
where dbo.Teacher.TID=1130 AND Q1=5 AND Q2=5...)
نام مستعار برای یک derived table الزامی است.
Salah Sanjabian
شنبه 04 خرداد 1392, 20:59 عصر
متاسفانه توضیحاتتون کامل نبود امیدوارم این کد جواب سوالتون یاشه من تا 3 ستون رو نوشتم خودت واسه فیلد هات تکرار کن
SELECT SUM(S) AS Qty FROM
(
SELECT COUNT(q1) AS S FROM
(
SELECT dbo.Teacher.*, dbo.Credit.CName, dbo.Evaluation.q1
FROM dbo.Student INNER JOIN
dbo.Evaluation ON dbo.Student.SID = dbo.Evaluation.SttID INNER JOIN
dbo.Syllabus ON dbo.Student.SID = dbo.Syllabus.[Student ID] AND dbo.Evaluation.syllID = dbo.Syllabus.SyID INNER JOIN
dbo.Credit ON dbo.Syllabus.[Credit ID] = dbo.Credit.CID INNER JOIN
dbo.Teacher ON dbo.Syllabus.[Teacher ID] = dbo.Teacher.TID
where dbo.Teacher.TID=1130
) D WHERE D.Q1=5
UNION ALL
SELECT COUNT(q2) FROM
(
SELECT dbo.Teacher.*, dbo.Credit.CName, dbo.Evaluation.q2
FROM dbo.Student INNER JOIN
dbo.Evaluation ON dbo.Student.SID = dbo.Evaluation.SttID INNER JOIN
dbo.Syllabus ON dbo.Student.SID = dbo.Syllabus.[Student ID] AND dbo.Evaluation.syllID = dbo.Syllabus.SyID INNER JOIN
dbo.Credit ON dbo.Syllabus.[Credit ID] = dbo.Credit.CID INNER JOIN
dbo.Teacher ON dbo.Syllabus.[Teacher ID] = dbo.Teacher.TID
where dbo.Teacher.TID=1130
) D WHERE D.Q2=5
UNION ALL
SELECT COUNT(q3) FROM
(
SELECT dbo.Teacher.*, dbo.Credit.CName, dbo.Evaluation.q3
FROM dbo.Student INNER JOIN
dbo.Evaluation ON dbo.Student.SID = dbo.Evaluation.SttID INNER JOIN
dbo.Syllabus ON dbo.Student.SID = dbo.Syllabus.[Student ID] AND dbo.Evaluation.syllID = dbo.Syllabus.SyID INNER JOIN
dbo.Credit ON dbo.Syllabus.[Credit ID] = dbo.Credit.CID INNER JOIN
dbo.Teacher ON dbo.Syllabus.[Teacher ID] = dbo.Teacher.TID
where dbo.Teacher.TID=1130
) D WHERE D.Q3=5
)D2
tooraj_azizi_1035
شنبه 04 خرداد 1392, 21:04 عصر
نام مستعار برای یک derived table الزامی است.
Have not tested
محمد سلیم آبادی
شنبه 04 خرداد 1392, 21:08 عصر
متاسفانه توضیحاتتون کامل نبود امیدوارم این کد جواب سوالتون یاشه من تا 3 ستون رو نوشتم خودت واسه فیلد هات تکرار کن
SELECT SUM(S) AS Qty FROM
(
SELECT COUNT(q1) AS S FROM
(
SELECT dbo.Teacher.*, dbo.Credit.CName, dbo.Evaluation.q1
FROM dbo.Student INNER JOIN
dbo.Evaluation ON dbo.Student.SID = dbo.Evaluation.SttID INNER JOIN
dbo.Syllabus ON dbo.Student.SID = dbo.Syllabus.[Student ID] AND dbo.Evaluation.syllID = dbo.Syllabus.SyID INNER JOIN
dbo.Credit ON dbo.Syllabus.[Credit ID] = dbo.Credit.CID INNER JOIN
dbo.Teacher ON dbo.Syllabus.[Teacher ID] = dbo.Teacher.TID
where dbo.Teacher.TID=1130
) D WHERE D.Q1=5
UNION ALL
SELECT COUNT(q2) FROM
(
SELECT dbo.Teacher.*, dbo.Credit.CName, dbo.Evaluation.q2
FROM dbo.Student INNER JOIN
dbo.Evaluation ON dbo.Student.SID = dbo.Evaluation.SttID INNER JOIN
dbo.Syllabus ON dbo.Student.SID = dbo.Syllabus.[Student ID] AND dbo.Evaluation.syllID = dbo.Syllabus.SyID INNER JOIN
dbo.Credit ON dbo.Syllabus.[Credit ID] = dbo.Credit.CID INNER JOIN
dbo.Teacher ON dbo.Syllabus.[Teacher ID] = dbo.Teacher.TID
where dbo.Teacher.TID=1130
) D WHERE D.Q2=5
UNION ALL
SELECT COUNT(q3) FROM
(
SELECT dbo.Teacher.*, dbo.Credit.CName, dbo.Evaluation.q3
FROM dbo.Student INNER JOIN
dbo.Evaluation ON dbo.Student.SID = dbo.Evaluation.SttID INNER JOIN
dbo.Syllabus ON dbo.Student.SID = dbo.Syllabus.[Student ID] AND dbo.Evaluation.syllID = dbo.Syllabus.SyID INNER JOIN
dbo.Credit ON dbo.Syllabus.[Credit ID] = dbo.Credit.CID INNER JOIN
dbo.Teacher ON dbo.Syllabus.[Teacher ID] = dbo.Teacher.TID
where dbo.Teacher.TID=1130
) D WHERE D.Q3=5
)D2
query اتان را به این شکل بنویسید بهینه تر است:
SELECT COUNT(CASE WHEN Q1 = 5 THEN 1 ELSE NULL END) +
COUNT(CASE WHEN Q2 = 5 THEN 1 ELSE NULL END) +
COUNT(CASE WHEN Q3 = 5 THEN 1 ELSE NULL END)
FROM (
SELECT dbo.Teacher.*, dbo.Credit.CName, dbo.Evaluation.q1
FROM dbo.Student INNER JOIN
dbo.Evaluation ON dbo.Student.SID = dbo.Evaluation.SttID INNER JOIN
dbo.Syllabus ON dbo.Student.SID = dbo.Syllabus.[Student ID] AND dbo.Evaluation.syllID = dbo.Syllabus.SyID INNER JOIN
dbo.Credit ON dbo.Syllabus.[Credit ID] = dbo.Credit.CID INNER JOIN
dbo.Teacher ON dbo.Syllabus.[Teacher ID] = dbo.Teacher.TID
where dbo.Teacher.TID=1130
) D
Salah Sanjabian
شنبه 04 خرداد 1392, 21:41 عصر
جناب سلیم آبادی به نطرم به جای Null صفر باید بذاری. درسته؟ چون Null با هرچی جمع بشه Null میشه
محمد سلیم آبادی
شنبه 04 خرداد 1392, 21:47 عصر
در این مورد نه.
در توابع تجمعی مقادیر NULL اصلا در نظر گرفته نمیشن
اگه اشتباه نکنم منظور شما همچین کدی بود:
SUM(CASE WHEN Q1 = 1 THEN 1 ELSE 0 END)
Salah Sanjabian
یک شنبه 05 خرداد 1392, 15:33 عصر
آره منظورم همین بود من تو یکی از تیکه کد هام مجبور شدم واسه SUM از ISNULL استفاده کنم
SELECT Type='OutGo',Name='SaledProductCost' ,Debtor=D.Value,Creditor=NULL
FROM
(
SELECT Value=ISNULL(SUM(CASE TypeRef
WHEN 'Sell' THEN ProductSumPrice-(DiscountPrice+Profit-ServiceSumPrice)
END),0)-
ISNULL(SUM
( CASE TypeRef
WHEN 'RevertSell' THEN ProductSumPrice-(ABS(Profit)+DiscountPrice)
END
),0)
FROM dbo.Factors
)D
فکر کنم اگه بین 2 تابع تجمعی بخوای از عملیات محاسباتی استفاده کنی باید از ISNULL استفاده کنی . چون من اینجا وقتی یکی از Sum ها Null برمیگردونه باعث میشه نتیجه کلی Nullباشه
محمد سلیم آبادی
یک شنبه 05 خرداد 1392, 16:04 عصر
همانطور که گفتم برگشت NULL توسط توابع تجمعی ارتباطی به وجود مقدار NULL در ستون مذکور ندارد.
من این را توسط یک مثال ثابت خواهم کرد.
شاید در گروه هیچ عضوی وجود ندارد که بخواهند با همدیگر جمع شوند به همین علت (خالی بودن مجموعه) مقدار NULL توسط توابع تجمعی برگردانده می شود.
به این مثال توجه کنید. در مورد اول چند سطر که دو سطر آن دارای مقدار NULL هستند را توسط تابع SUM با یکدیگر جمع می کنیم و خواهیم دید که هیچ مشکلی بوجود نمی آید.
در مورد دوم کل سطرها را حذف میکنیم و می بینیم که تابع SUM مقدار NULL را بر می گرداند.
declare @t table (i int)
insert @t values (1),(1),(null),(null)
select sum(i) as total
from @t
/*
total
-----------
2
Warning: Null value is eliminated by an aggregate or other SET operation.
(1 row(s) affected)
*/
delete from @t
select sum(i) as total
from @t
/*
total
-----------
NULL
(1 row(s) affected)
*/
Salah Sanjabian
یک شنبه 05 خرداد 1392, 17:06 عصر
شاید در گروه هیچ عضوی وجود ندارد که بخواهند با همدیگر جمع شوند به همین علت (خالی بودن مجموعه) مقدار NULL توسط توابع تجمعی برگردانده می شود.
declare @t table (i int)
insert @t values (1),(1),(null),(null)
(1 row(s) affected)
*/
delete from @t
select sum(i) as total
from @t
/*
total
-----------
NULL
(1 row(s) affected)
*/
آره . منم به خاطر همین از ISNULLاستفاده کردم . وقتی یکی از دو عبارت (طرفین منها) من هیچ داده ای نداشته باشه Null بر میگردونه
mustafaehsani
دوشنبه 06 خرداد 1392, 11:28 صبح
ممنون از هم اساتید که اینهمه وقت انرژی گذاشتند.
104700
میخوام بدونم در این جدول
1- چندتا سلول توش عدد 5 هست
2- چندتا سلول توش 4 هست
3- چندتا سلول توش 3 هست
4- چندتا سلول توش 2 هست
5- چندتا سلول توش 1 هست
cherchil_hra
سه شنبه 07 خرداد 1392, 07:19 صبح
به فرض اینکه حاصل جدول شما، جدول MyTable باشد، تعداد تکرار هر عدد در ستون های q1 تا q10 رو بدین صورت می توانید محاسبه کنید:
SELECT myVal, COUNT(myval) [Count]
FROM (SELECT q1, q2, q3, q4, q5, q6, q7, q8, q9, q10 FROM MyTable) AS t
UNPIVOT( MyVal FOR myColumn IN (q1, q2, q3, q4, q5, q6, q7, q8, q9, q10) ) AS unpvt
GROUP BY MyVal
ابتدا ستون ها رو به سطر تبدیل می کنیم و تعداد هر عدد رو براساس MyColumn (که گروه بندی براساس آن انجام شده است) حساب می کنیم که محدود به عدد 1 تا 5 هم نیست؛ یعنی اگه مقدار عددی غیر از اینها هم داشته باشید تعداد آن به شما نمایش داده خواهد شد.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.