ورود

View Full Version : گرفتن تعداد واقعی نتیجه یک query ای که از top استفاده شده است



djscsi
پنج شنبه 08 تیر 1391, 21:14 عصر
دوستان من یه query دارم که در اون از top 100 استفاده کردم ولی نیاز دارم تعداد واقعی نتیجه رو هم بدونم
ممنون میشم کمکم کنید.

desatir7316
پنج شنبه 08 تیر 1391, 21:38 عصر
یعنی چی تعداد واقعی نتیجه؟
خوب یکی هم بدون top 100 بنویس البته اگه منطورتون اینه

djscsi
جمعه 09 تیر 1391, 13:09 عصر
ممنون از اینکه جواب دادید.
ولی اینکه من اول بیام cout(*) بگیریم برای مشخص شدن تعداد و بعد بیام کوئری رو اجرا کنم تا سطرها رو بگیرم فکر نکنم روش درستی باشه
کسی نظر دیگه ای نداره

desatir7316
جمعه 09 تیر 1391, 18:06 عصر
دوست عزیز میشه یه مثال از کدت بزنی یا اصلا واضح بگی چی میخوای، من اینجوری متوجه منظورت نمی شم
البته شاید سایر دوستان بتونن کمک کنن

djscsi
جمعه 09 تیر 1391, 23:48 عصر
ببین فرض کن شما یه جدول داخل دیتابیش داری با 1000 رکورد. با دستور select * from mytable همه ی 1000 تا رو برات میاره . ولی شما نمیخای هر 1000 تاش رو ببینی پس مینویسی select top 50 * from mytable این میاد 50 رکورد اول از جدول رو میاره.
حالا شما اگه بخای تعداد رکوردی رو که در جدول وجود داره بدونی پس باید کوئری select count(*) from mytable رو اجرا کنی تا تعداد کل بدست بیاد.
توی mysql دستوری هست که با یک کوئری شما هم 50تای اول رو میگیره و هم بهت میگه کلش چند تا بوده
حالا من میخام بدونم مشابه این دستور تو sql چیه؟

zayens
شنبه 10 تیر 1391, 00:23 صبح
توی mysql دستوری هست که با یک کوئری شما هم 50تای اول رو میگیره و هم بهت میگه کلش چند تا بوده
یه چیزی میگیدا !!
آخه وقتی مثلا 50 تا رکورد اول یک جدول نمایش داده بشه، مقدار count مگه میشه نمایش داده بشه؟! کجا باید نشون داده بشه؟ انتظار که ندارین یه Column در کنار ستونهای جدولتون اضافه بشه و همش با 50 پر بشه!؟

zayens
شنبه 10 تیر 1391, 00:29 صبح
در هر صورت این کدیه که لازم داری

select top(10)*,ROWCOUNT_BIG() as NumOfNewTable from TABLE

این کوئری را هم تحت مثال روی یه جدول 200 رکوردی استفاده کردم که نتیجه داخل عکس هستش
88958

desatir7316
شنبه 10 تیر 1391, 00:44 صبح
نمی دونم که کوئری خاصی برای این کار وجود داره یا نه
این کوئری شاید نرمال نباشه ولی فعلا از هیچی بهتره:

use AdventureWorks
declare @num int
select @num= COUNT(*) from Production.Product
select top 50 *,@num from Production.Product

desatir7316
شنبه 10 تیر 1391, 00:51 صبح
د

select top(10)*,ROWCOUNT_BIG() as NumOfNewTable from TABLE


88958

دوست عزیز من این دستور رو روی AdventureWorks روی جدول Production.Product امتحان کردم همش رو صفر نشون داد
درضمن من فکر می کنم که توی اون ستون جدید توی مثال خودتون باید مقدار 200 رو نشون بده ن

ASKaffash
شنبه 10 تیر 1391, 07:56 صبح
سلام
لطفا دستور MySQL که اینکار را انجام میدهد را قرار دهید تا بحث فنی کنیم


ببین فرض کن شما یه جدول داخل دیتابیش داری با 1000 رکورد. با دستور select * from mytable همه ی 1000 تا رو برات میاره . ولی شما نمیخای هر 1000 تاش رو ببینی پس مینویسی select top 50 * from mytable این میاد 50 رکورد اول از جدول رو میاره.
حالا شما اگه بخای تعداد رکوردی رو که در جدول وجود داره بدونی پس باید کوئری select count(*) from mytable رو اجرا کنی تا تعداد کل بدست بیاد.
توی mysql دستوری هست که با یک کوئری شما هم 50تای اول رو میگیره و هم بهت میگه کلش چند تا بوده
حالا من میخام بدونم مشابه این دستور تو sql چیه؟

Galawij
شنبه 10 تیر 1391, 09:45 صبح
سلام.


دوستان من یه query دارم که در اون از top 100 استفاده کردم ولی نیاز دارم تعداد واقعی نتیجه رو هم بدونم
ممنون میشم کمکم کنید.

در T_SQL به صورت مستقیم همچین دستوری رو نداریم. ولی من یک نمونه کد براتون می ذارم که همین کار رو می کنه:
;WITH CTE AS(select row_number() over (order by dbo.TbAlphabet.IdAlphabetical) as RowNum,IdAlphabetical,AlphabeticalChar from dbo.TbAlphabet)
select AlphabeticalChar,(select max(RowNum) as Counts from CTE) as Counts from CTE where CTE.RowNum<=20

zayens
شنبه 10 تیر 1391, 19:26 عصر
سلام.

در T_SQL به صورت مستقیم همچین دستوری رو نداریم. ولی من یک نمونه کد براتون می ذارم که همین کار رو می کنه:
;WITH CTE AS(select row_number() over (order by dbo.TbAlphabet.IdAlphabetical) as RowNum,IdAlphabetical,AlphabeticalChar from dbo.TbAlphabet)
select AlphabeticalChar,(select max(RowNum) as Counts from CTE) as Counts from CTE where CTE.RowNum<=20

از افرادی مثل شما انتظار میره که کدهاشون را داخل تگ قرار بدن!



دوست عزیز من این دستور رو روی AdventureWorks روی جدول Production.Product امتحان کردم همش رو صفر نشون داد
درضمن من فکر می کنم که توی اون ستون جدید توی مثال خودتون باید مقدار 200 رو نشون بده
چنین چیزی نیست
شمایید که اشتباه میکنید
88995
اینبار کوئری را با top5 استفاده کردم
در عکس نتیجه کاملا مشهوده!
میبینیم که تعداد رکوردها تقریبا 200 تاست(دقیقا 162 تا) و با زدن این کوئری برای نشون دادن 5 رکورد اول در ستون آخر هم 5 را نمایش میده نه 200 را

desatir7316
شنبه 10 تیر 1391, 22:01 عصر
چنین چیزی نیست
شمایید که اشتباه میکنید
88995
اینبار کوئری را با top5 استفاده کردم
در عکس نتیجه کاملا مشهوده!
میبینیم که تعداد رکوردها تقریبا 200 تاست(دقیقا 162 تا) و با زدن این کوئری برای نشون دادن 5 رکورد اول در ستون آخر هم 5 را نمایش میده نه 200 را

جناب مهندس اصلا ما نیاز نداریم که توی ستون آخر مقدار 5 رو نشون بدیم
ستون آخر باید اینجا مقدار 162 رو نشون بده
5 رو که خودمون توس select top.... دادیم به چه دردمون می خوره
حالا این که روی table من اصلا جواب نداد رو نمی دونم ولی در هر صورت اول سوال رو کامل بفهمید بعد بحث کنید جسارتا

Felony
یک شنبه 11 تیر 1391, 06:37 صبح
SELECT TOP(20) *, (SELECT Count(*) FROM Patients) FROM Patients

zayens
یک شنبه 11 تیر 1391, 15:10 عصر
جناب مهندس اصلا ما نیاز نداریم که توی ستون آخر مقدار 5 رو نشون بدیم
ستون آخر باید اینجا مقدار 162 رو نشون بده
5 رو که خودمون توس select top.... دادیم به چه دردمون می خوره
حالا این که روی table من اصلا جواب نداد رو نمی دونم ولی در هر صورت اول سوال رو کامل بفهمید بعد بحث کنید جسارتا

یعنی ستون آخر باید تعداد کل را نشون بده!؟

پس درین صورت بله درسته، من اشتباه متوجه شده بودم
درین صورت کدی که جناب تاجیک گذاشتن جواب مد نظر ما خواهد بود
SELECT TOP(20) *, (SELECT Count(*) FROM MYTABLE) FROM MYTABLE

ASKaffash
دوشنبه 12 تیر 1391, 06:57 صبح
سلام
کدهای ارائه شده درست است که جواب صحیح میدهد ولی از نظر کارائی برای حجم زیاد داده ها اصلا موردقبول نیست مثلا در کد ارائه شده برای 20 رکورد جدول MyTable بیست بار Scan می شود باید اینطوری نوشته شود :

Declare @C Bigint=(Select Count(*) From MyTable)
Select Top 20 *,C=@C From MyTable