PDA

View Full Version : راهنمایی برای نوشتن select تودرتو



adhami
یک شنبه 10 تیر 1386, 15:56 عصر
با سلام خدمت دوستان
یک تیبل دارم که شامل شماره پرسنلی و کددوره است .
تیبل دیگری دارم که شامل شماره پرسنلی و نام و نام خانوادگی و .. است .
حال می خواهم گزارشی بگیرم که به من کد دوره های را نشان دهد که تعداد نفرات ثبت نام کننده در آن بیشتر از 9 نفر باشد و نفرات ثبت نامی را نیز نشان دهد.
خوب من این دو تا تیبل را با شماره پرسنلی به هم ارتباط دادم .


SELECT COUNT(int_percode) AS tedad, int_code, chr_doreh From dbo.rptniaz GROUP BY int_code, chr_doreh Having COUNT(int_percode) > 9

و این کد را نوشتم ولی این فقط کد دوره و دوره را نشان می دهد .
منتظر راهنماییهای شما هستم .
با تشکر

whitehat
یک شنبه 10 تیر 1386, 23:15 عصر
با فرض اینکه جدول پرسنل با نام Personels و جدول دوم با نام Periods باشد، می توانید شما از کوئری زیر با کمی تغییر نام ها استفاده کنید


Select * From
Personels Inner Join Periods
On Personels.PersonelId=Periods.PersonelID
Where Periods.PercodeId IN
(Select PercodeId ّFrom Periods
Group By PercodeId
Having Count(PersonelId)>9) As TempTable

AminSobati
دوشنبه 11 تیر 1386, 00:53 صبح
دوست عزیزم،
منطقا زمانی که Aggregation انجام میدین، یعنی اصل رکوردها باید حذف بشن. در غیر اینصورت رکوردهای اضافی باید در نتیجه Query داشته باشید. در اصل، خود ساختار گزارش نهایی شما با مشکل روبرو میشه اگر هم نتیجه Aggregation و هم اصل رکوردها رو بخواین در یک Result set بدست بیارین.
من برای اینکه بتونم یک راه حل ارائه کنم، صورت مسئله شما رو به این شکل تعبیر میکنم:
مشتری هایی رو بدست بیاریم که سفارش ارسال کرده باشند به هر کدوم از کشورهایی که تا به حال بیش از 80 سفارش به اونها ارسال شده (در دیتابیس Northwind):


select * from customers
where customerid in (
select customerid from orders
where shipcountry in (
select shipcountry from orders group by shipcountry
having count(orderid)>=80))

این Query به روشهای مختلف میتونه نوشته بشه و تنها راه حل نیست

AminSobati
دوشنبه 11 تیر 1386, 01:03 صبح
با فرض اینکه جدول پرسنل با نام Personels و جدول دوم با نام Periods باشد، می توانید شما از کوئری زیر با کمی تغییر نام ها استفاده کنید


Select * From
Personels Inner Join Periods
On Personels.PersonelId=Periods.PersonelID
Where Periods.PercodeId IN
(Select PercodeId ّFrom Periods
Group By PercodeId
Having Count(PersonelId)>9) As TempTable


این روش خوبه ولی به خاطر Join تکرار هم خواهد داشت. ناچارا باید Distinct اضافه کرد که شاید روی تعداد فیلدهای زیاد کار پردازش رو سخت کنه!