PDA

View Full Version : چند select در یک select



jas1387
دوشنبه 03 فروردین 1388, 12:33 عصر
با سلام خدمت دوستان
فرض کنید من یک جدول دارم که دو فیلد به نام های name و age دارد حال می خواهم چند select را درون یک select انجام بدهم به صورتی که خروجی کار سه فیلد باشه به نام های small ، medium ، large که در فیلد اولی تعداد افرادی که سن آنها بین 7 تا 21 سال نشان بدهد و فیلد دومی تعداد افرادی که سن آنها بین 25 تا 50 و فیلد سومی تعداد افرادی که سن آنها بین 55 تا 80 سال است نشان دهد من از دستورات زیر استفاده کردم :


SELECT Count(age) AS small


FROM Table2


WHERE (((Table2.age) Between "7" And "21"))


UNION SELECT count(age) as medium


FROM Table2


WHERE (((Table2.age) Between "25" And "50"))


UNION SELECT count(age) as large


FROM Table2


WHERE (((Table2.age) Between "55" And "80"));



ولی نتیجه این کد : یک ستون است به نام اولین فیلد ( small ) که دو سطر دارد با مقدار های 2 (سطر اول ) و 5 (سطر دوم ) ، حال چکار کنم که سه ستون با مقدار های متناسب با آنها داشته باشم .
با تشکر

siavash_realy
دوشنبه 03 فروردین 1388, 12:58 عصر
سلام شما چندين راه واسه اينكار داريد اما اگر از راه خودتون بخواهيم بريم بايد اينطوري بنويسيدش :
SELECT Count(age) AS Age_Count , 'Small' AS Age_Group From Table2 WHERE (Table2.age >= 7 AND Table2.age <= 21)
UNION
SELECT Count(age) AS Age_Count , 'Medium' AS Age_Group From Table2 WHERE (Table2.age > 21 AND Table2.age <= 50)
UNION
SELECT Count(age) AS Age_Count , 'Large' AS Age_Group From Table2 WHERE (Table2.age > 50 AND Table2.age <= 80)

siavash_realy
دوشنبه 03 فروردین 1388, 13:01 عصر
اما اگر از SQL Server 2008 استفاده ميكنيد راه هاي بهتري هم مثل استفاده از PIVOT داريد همينطور ميتونيد از دستور CASE هم استفاده كنيد كه در همه نسخه هاي SQL Server وجود داره،با استفاده از اين دو دستور ميتونيد نتايج رو به شكل سطري بدست آوريد (به جاي ستوني)

Dariuosh
دوشنبه 03 فروردین 1388, 13:15 عصر
فضولي منو ببخشيد

WHERE (Table2.age >= 7 AND Table2.age <= 21)

از BETWEEN خوب استفاده کنيد

اما اگر از SQL Server 2008 استفاده ميكنيد راه هاي بهتري هم مثل استفاده از PIVOT داريد (به جاي ستوني)
2005 هم PIVOT داره

siavash_realy
دوشنبه 03 فروردین 1388, 13:57 عصر
اگر از sqll 2005 or sql 2008 استفاده ميكني ميتوني از اين دستور استفاده كني كه نتيجه اش ميشه هموني كه ميخواي :
SELECT [Small], [Medium], [Large] FROM
(SELECT Age, CASE WHEN (age >= 7 AND age <= 21) THEN 'Small'
WHEN (age > 21 AND age <= 50) THEN 'Medium'
WHEN age > 50 THEN 'Large'
END AS MyGroup
FROM Table2) AS SourceTable
PIVOT (
Count(age) FOR MyGroup IN ([Small], [Medium], [Large])
) AS PivotTable

siavash_realy
دوشنبه 03 فروردین 1388, 13:58 عصر
و به قول دوستمون واسه اينكه كدتون گويا تر و زيباتر بشه بهتره از Between استفاده كنيد

jas1387
سه شنبه 04 فروردین 1388, 07:27 صبح
سلام
ضمن تشکر از شما دوست گرامی
اگر امکان داره درباره کدی که نوشته اید یه خورده توضیح بدهید چون من سر در نمی آرم ( sql را در حد مبتدی بلدم ) حتی نتونستم به جای بزرگتر و کوچکتر Between بگذارم
اگه میشه این کد را توضیح بدهید چون من از این کد استفاده کردم و جوابی که می خواستم گرفتم


SELECT [Small], [Medium], [Large] FROM
(SELECT Age, CASE WHEN (age >= 7 AND age <= 21) THEN 'Small'
WHEN (age > 21 AND age <= 50) THEN 'Medium'
WHEN age > 50 THEN 'Large'
END AS MyGroup
FROM Table2) AS SourceTable
PIVOT (
Count(age) FOR MyGroup IN ([Small], [Medium], [Large])
) AS PivotTable



با تشکر

jas1387
سه شنبه 04 فروردین 1388, 15:50 عصر
سلام
من از کد زیر استفاده کردم ولی مقدار صفر را در جواب به من داد در صورتی که باید مقدار های 5و10و6 به من می داد اشکال از کجاست ؟


SELECT [Sikle], [Diplom], [Lisans] FROM
(SELECT Sate, CASE WHEN (Sate='سیکل') THEN 'Sikle'
WHEN (Sate='دیپلم') THEN 'Diplom'
WHEN (Sate='لیسانس') THEN 'Lisans'
END AS MyGroup
FROM Tahsilat) AS SourceTable

PIVOT (
Count(Sate) FOR MyGroup IN ([Sikle], [Diplom], [Lisans])
) AS PivotTable

siavash_realy
سه شنبه 04 فروردین 1388, 19:44 عصر
دستوري كه نوشتي مشكلي نداره ، شايد بهتر باشه قبل از علامت سينگل كوت ، پس از مساوي يك حرف N بگذاري يعني اينطوري بنويسي :

... CASE WHEN (Sate=N'سیکل') THEN 'Sikle'
WHEN (Sate=N'دیپلم') THEN 'Diplom'
WHEN (Sate=N'لیسانس') THEN 'Lisans' ...

اگر ديدي نشد لطفا يك فايل اكسل يا اكسس يا هر چيزي كه توش چند تا داده داري واسم بگذار اينجا تا تستش كنم ، شايد مشكل جايي ديگه باشه، اما دستوري كه نوشتي كاملا درسته

siavash_realy
سه شنبه 04 فروردین 1388, 21:52 عصر
راستي يادم افتاد شايد تو هم مشكل تفاوت حرف ي رو تو بانكت و دستور select‌ات داشته باشي - چكش كن حتما ! موفق باشي

jas1387
چهارشنبه 05 فروردین 1388, 10:30 صبح
با سلام

msg 208 چیست ؟

من می خواستم کدی که شما گفتید را امتحان کنم ولی با این error روبرو شدم !!!!!!!!

حتی یه دستور ساده ای مثل تصویر پایین هم دیگه کار نمی کنه :گیج:

لطفا من را راهنمایی کنید :لبخند:

http://mail.google.com/mail/?attid=0.1&disp=emb&view=att&th=1203c518ee2a77d1

همین جور که در زبانه دوم تصویر بالا می بینید جدول Human وجود دارد!!!!!!!!!!!

siavash_realy
پنج شنبه 06 فروردین 1388, 12:53 عصر
اينجا كه تصويري نيست ؟! :متعجب:

jas1387
جمعه 07 فروردین 1388, 19:35 عصر
اگر از sqll 2005 or sql 2008 استفاده ميكني ميتوني از اين دستور استفاده كني كه نتيجه اش ميشه هموني كه ميخواي :
SELECT [Small], [Medium], [Large] FROM
(SELECT Age, CASE WHEN (age >= 7 AND age <= 21) THEN 'Small'
WHEN (age > 21 AND age <= 50) THEN 'Medium'
WHEN age > 50 THEN 'Large'
END AS MyGroup
FROM Table2) AS SourceTable
PIVOT (
Count(age) FOR MyGroup IN ([Small], [Medium], [Large])
) AS PivotTable


سلام
ضمن سپاس از شما بابت راهنمایی های قبلی تون
اگر بخواهیم در دستور بالا یک فیلد دیگر اضافه کنیم آیا امکان دارد؟ چون در کد بالا فقط نتایجی مختلفی را از یک فیلد بدست می آوریم حالا من می خواهم یک فیلد دیگر به کد بالا اضافه کنم ( مثلا تعداد کسانی که دیپلم دارند را نشان دهد ) فیلد tahsilat
لطفا به من کمک کنید

siavash_realy
شنبه 08 فروردین 1388, 11:16 صبح
سلام
هيچ كاري نشد نداره ، اما موضوع اينه كه من نفهميدم تو چطور ميخواي اون رو اضافه كني يعني ميخواي تو هر دسته ، small,medium,large ببيني چه تعداد ديپلم دارند، چه تعداد ليسانس و ... ؟
اگر يك همچين هدفي داسته باشي بهترين ابزار واسه ساخت چنين query هايي استفاده از microsoft sql analysis services هستش چون اين كار رو مثل آب خوردن واست انجام ميده (به جاي اينكه تو sql از database engine استفاده كني بايد از analysis services بهره ببري) البته روش نوشتن دستورات در اونجا مثل نوشتن select تو Database engine نيست با چند روز تمرين ياد ميگيري چطور دستورات اون رو بنويسي و خيلي هم آسونه و پيشنهاد من استفاده از sql 2008 به جاي sql 2005 واسه اين كاره !

jas1387
شنبه 08 فروردین 1388, 12:28 عصر
دوست عزیز سلام

آیا اینجا نمیشه این کار را کرد زیرا 90 % کار من انجام شده لطفا اگه میشه من را راهنمایی کنید

ممنون

siavash_realy
شنبه 08 فروردین 1388, 14:24 عصر
باشه پس ميشه لطف كني و دقيقا بگي ميخواي مقدار اين فيلد حاوي چه اطلاعاتي باشه ؟ من 2تا سناريو تو ذهنم اومده كه نميدونم تو كدومش رو ميخواي !
1- تو ميخواي ببيني در كل تو جدول Table2‌ات چند نفر ديپلم داري ؟
2- يا اينكه تو ميخواي ببيني تو گروه small,medium,large به تفكيك چند نفر ديپلم داري ؟

من همين 2تا سناريو به ذهنم رسيد ، اگر چيزي كه ميخواي يكي از اين دو تا سناريو هستش بهم بگو كدومش رو مد نظر داري، اگر هم سناريوت چيز ديگه اي هست اون رو دقيق به من بگو !

jas1387
شنبه 08 فروردین 1388, 22:25 عصر
سلام




ضمن تشکر بابت توجهات شما



فرض کنید که من در table ام دو تا فیلد به نام های shogle ( که مقدارش را از radiobutton ها می گیرد ( و Saier_sh ( که مقدارش را از textbox می گیرد ) دارم حال با کدی که شما قبلا به من دادید توانستم فیلد Shogle را با تفکیک عنوان شغلی مشخص کنم اکنون می خواهم ببینم که تعداد کسانی که فیلد saier_sh را پر کرده اند چند نفر است


به عبارتی دیگر من می خواهم کار زیر را انجام دهم


نام شغل تعداد افراد


1. آزاد 10


2. کارمند 30


3. کارگر 5


4. کشاورز 10


5. مشاغل دیگر 10


با کدی که قبلا شما لطف کردید من توانستم موارد 1 تا 4 را که در فیلد shogle بود محقق کنم حال می خواهم مورد 5 را که از فیلد saier_sh است را بدست آورم


با تشکر

siavash_realy
یک شنبه 09 فروردین 1388, 11:25 صبح
دستور select اي كه نوشتي رو به اين صورت تغيير بده تا بتوني واسه "مشاغل ديگر" (سنين ديگر) ازش استفاده كني :

SELECT [Small], [Medium], [Large], [Other] FROM
(SELECT Age, CASE
WHEN (age >= 7 AND age <= 21) THEN 'Small'
WHEN (age > 21 AND age <= 50) THEN 'Medium'
WHEN age > 50 THEN 'Large'
ELSE 'Other'
END AS MyGroup
FROM Table2) AS SourceTable
PIVOT (
Count(age) FOR MyGroup IN ([Small], [Medium], [Large],[Other])
) AS PivotTable

jas1387
یک شنبه 09 فروردین 1388, 11:52 صبح
دستور select اي كه نوشتي رو به اين صورت تغيير بده تا بتوني واسه "مشاغل ديگر" (سنين ديگر) ازش استفاده كني :

SELECT [Small], [Medium], [Large], [Other] FROM
(SELECT Age, CASE
WHEN (age >= 7 AND age <= 21) THEN 'Small'
WHEN (age > 21 AND age <= 50) THEN 'Medium'
WHEN age > 50 THEN 'Large'
ELSE 'Other'
END AS MyGroup
FROM Table2) AS SourceTable
PIVOT (
Count(age) FOR MyGroup IN ([Small], [Medium], [Large],[Other])
) AS PivotTable

دوست عزیز سنین دیگر در فیلد age نیست در فیلد saier_age هست