PDA

View Full Version : سوال: یک query نسبتا پیچیده



cjNet
جمعه 21 آبان 1389, 10:58 صبح
سلا م به همه دوستان .
من یک جدول دارم با نام جدول نرم افزار های فروخته شده با فیلد های زیر :

1.ID
2. کد نرم افزار
3. نام کاربری خریدار نرم افزار
4. تاریخ خرید


حالا من می خوام اون کاربرهایی رو که بیش از یک نوع نرم افزار خریده اند رو با توجه به کد نرم افزار بدست بیارم .

ممنون از کمکتون ....

Reza_Yarahmadi
جمعه 21 آبان 1389, 15:56 عصر
يك راه ميتونه بصورت زير باشه (اين كوئري از SQL Server 2005 به بعد كار ميكنه)
With Buys as(
Select
UserId,
SoftwareId
From
TableName
Group By
UserId,
SoftwareId
)
Select
UserId,
Count(*) as BuyCount
From
Buys
Group By
UserId
Having
Count(*) > 1

cjNet
جمعه 21 آبان 1389, 16:18 عصر
ممنون دوست عزیز .
فقط اگه کد رو یه تحلیل کوچولو بکنی ممنون میشم . :لبخندساده:

Reza_Yarahmadi
جمعه 21 آبان 1389, 16:42 عصر
توي كد فرض شده كاربر ميتونه از يك نمونه نرم افزار چندبار خريد كنه ،به همين خاطر ابتدا يك گروه بندي روي جدول بر اساس كد كاربر و كد نرم افزار انجام شده تا اگر چندبار خريد شده بود تنها يكبارش در نظر گرفته بشه ، نتيجه توي يك جدول مجازي با نام Buys ريخته شده. بعد روي Buys يك گروه بندي بر اساس كد كاربر انجام شده با شرط اينكه بيش 1 ركورد براش وجود داشته باشه (بيش از يك خريد كرده باشه) ، كد كاربر به اضافه تعداد خريدهاش هم به عنوان خروجي گزارش بده.
اميدوارم توضيحات كافي باشه!!!

Rezahak
شنبه 22 آبان 1389, 09:23 صبح
سلام
ببخشيد من يك سئوال داشتم
مي خواستم بدونم فرق استفاده از with با اينكه ما در قسمت from يك select بنويسيم چيه؟

Reza_Yarahmadi
شنبه 22 آبان 1389, 09:36 صبح
مي خواستم بدونم فرق استفاده از with با اينكه ما در قسمت from يك select بنويسيم چيه؟
در مورد With گفته شده تا SQL تا جايي كه بتونه دستور رو بهينه ميكنه و بهترين اجراي ممكنه رو اعمال ميكنه. ضمن اينكه فرض كنيد شما بخوايد روي يك جستجو شرطهاي خاصي بذاريد و نتيجه همه اونها رو با هم جمع كنيد ، در اين حالت به روشي كه شما گفتيد براي هر كدوم يكبار روي كل جدول جستجو انجام ميديد و شرط مورد نظر رو اعمال ميكنيد در حالي كه با With يكبار جسجتوي پايه رو انجام ميديد بعد روي اين جستجوي پايه شرطها رو اعمال ميكنيد و درآخر نتياج رو باهم جمع ميكنيد.
مثال:
With h1 as
(
Select
*
From
TableName
Where
Id > 100
)
,
h2 as(
select
*
From
h1
Where
Name Like 'Re%'
)
,
h3 as(
select
*
From
h1
Where
Family Like 'Re%'
)
,
h4 as(
select
*
From
h1
Where
Address Like 'Re%'
)
Select * From h2
UNION ALL
Select * From h3
UNION ALL
Select * From h4
البته اين مثال رو ميشه با يك دستور هم نوشت ولي در بعضي از مواقع نوشتن توي يك دستور غير ممكنه.