PDA

View Full Version : بهترین تور



amin1softco
دوشنبه 13 تیر 1390, 08:05 صبح
اگه هر مسافری (pid ) با یک تور (tid) سفر کنه پرطرفدار ترین تور می شه توری که بیشتر مسافران با اون سفر می کنند من برای بدست آوردن تعداد بیشترین مسافرای یک تور یک همچین کوئریی نوشتم :

select count(pid) from [pt] where tid=1123


حالا سوالم اینه که چطوری باید برای هر تور تعداد مسافراش رو بدست آورد و ماکزیمم اونا رو انتخاب کرد؟:متفکر:

amin1softco
دوشنبه 13 تیر 1390, 08:56 صبح
خودم این کد رو نوشتم :

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'aa') DROP TABLE aa
CREATE TABLE aa (a INT)
INSERT INTO aa
SELECT count(PID) FROM [pt]
GROUP BY TID
SELECT MAX(a) AS [max] FROM aa

به نظرتون راه ساده تری وجود نداره؟

amin1softco
دوشنبه 13 تیر 1390, 10:04 صبح
فکر کنم این بهترین راهه:

DECLARE @Table TABLE(TID INT,_count INT)
INSERT INTO @Table
SELECT TID,count(PID) FROM [pt]
GROUP BY TID
SELECT TID FROM @Table
WHERE [_count] IN(SELECT MAX([_count]) FROM @Table)

behrouzlo
دوشنبه 13 تیر 1390, 10:30 صبح
با این هم می شه به جواب رسید

With Tbl As (
Select tid,Count(*) CNT From pt
Group By tid)

Select * From Tbl Where CNT = (Select Max(Cnt) From Tbl)

محمد سلیم آبادی
جمعه 17 تیر 1390, 19:59 عصر
راه حل پست قبلی بنظر میرسه مربوط میشه به بحث Mode روش های زیادی برای حل اون موجود که برخی از اونها در پست زیر قابل مشاهده است:
http://www.30sharp.com/article/13/297/11/%d9%85%d8%ad%d8%a7%d8%b3%d8%a8%d9%87-mode-%d8%af%d8%b1-%d8%a8%d8%ad%d8%ab-%d8%a2%d9%85%d8%a7%d8%b1.aspx

amin1softco
جمعه 17 تیر 1390, 21:46 عصر
شرمنده ها ولی من باید با اس کیو ال 2000 کد بزنم و نمی شه که از With Tbl As استفاده کرد

محمد سلیم آبادی
پنج شنبه 23 تیر 1390, 05:06 صبح
فکر کنم این بهترین راهه:

DECLARE @Table TABLE(TID INT,_count INT)
INSERT INTO @Table
SELECT TID,count(PID) FROM [pt]
GROUP BY TID
SELECT TID FROM @Table
WHERE [_count] IN(SELECT MAX([_count]) FROM @Table)



شرمنده ها ولی من باید با اس کیو ال 2000 کد بزنم و نمی شه که از With Tbl As استفاده کرد

این روش بدون Common Table Expression هست و استاندارد.
درواقع همان روشی هست که در این پست نقل قول کردم. ولی بدون نیاز به هیچ گونه جدول (موقت یا متغیری) اضافی:

SELECT TID, COUNT(*)
FROM pt
GROUP BY TID
HAVING COUNT(*) =
(SELECT MAX(Cnt)
FROM
(SELECT COUNT(*)
FROM pt
GROUP BY TID)D(cnt)
);

محمد سلیم آبادی
جمعه 24 تیر 1390, 05:48 صبح
فراموش کردم بگم که وقتی در جدول گروه وجود نداره و همه در یک گروه طبقه بندی میشن. ساده ترین راه در SQL Server استفاده از ماده ی TOP به شکل زیر هست:

SELECT TOP 1 TID, COUNT(*) AS cnt
FROM pt
ORDER BY cnt DESC;