PDA

View Full Version : ایده برای درست کردن این گزارش



salmah
دوشنبه 16 تیر 1393, 18:09 عصر
سلام
من دوتا جدول دارم
جدول اول : nam , famil, ID
جدول دوم: ID, modat, و یه سری فیلددیگه مثل تاریخ شروع وپایان دوره.
حالا میخوام یه گزارش بگیرم به صورت زیر که نام و فامیل را از جدول 1 بگیره و مجموع ساعات هر فرد را بیاد از جمع ستون modat از جدول2برای هر کاربر به دست بیاره
باید چه پروسیجری بنویسم ؟روش کار چیه
120867

salmah
دوشنبه 16 تیر 1393, 18:28 عصر
البته ID توی هیچ کدوم از جدول ها کلید نیست:اشتباه:

aslan
دوشنبه 16 تیر 1393, 19:21 عصر
Select Nam,Famil,Sum(Modat) from J1 Inner Join J2 On J1.ID=J2.ID Group By Nam,Famil

salmah
دوشنبه 16 تیر 1393, 21:37 عصر
عالی بود تشکر

salmah
سه شنبه 17 تیر 1393, 22:50 عصر
یه سوال دیگه اگربخواهم یه شرط بذارم مجموع ساعات (modat)همه کاربران از تاریخ x تا تاریخ y رانمایش بده باید چی بنویسم
من به این صورت نوشتم ولی خطا داره


SELECT tuser.nam, tuser.famil, tsabtedoreh.datastart, tsabtedoreh.dataend,
tsabtedoreh.codepersoneli , tuser.codepersoneli , tsabtedoreh.accept
FROM tuser INNER JOIN
tsabtedoreh ON tuser.codepersoneli = tsabtedoreh.codepersoneli
WHERE tsabtedoreh.accept='True'

GROUP BY tuser.nam, tkarmandan.famil, tsabtedoreh.datastart, tsabtedoreh.dataend, tsabtedoreh.nomreh,
tsabtedoreh.codepersoneli, tkarmandan.codepersoneli
HAVING (tsabtedoreh.datastart >= @datastart) AND (tsabtedoreh.dataend <= @dataend)
ORDER BY tsabtedoreh.datastart

aslan
سه شنبه 17 تیر 1393, 23:17 عصر
سلام
شکل کلی چیزی که نیاز دارین بشکل زیر هستش :


SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name

پس : مقایسه تاریخ باید بعد از where بیاید
Having لازم نیست اینجا
اگرامکان داشته باشد که در جدول اول رکوردی وجود داشته باشد که در جدول دوم برایش رکوردی ( مدتی ) ثبت نشده باشد باید بجای inner join از Left Outer Join استفاده کنید
چون ممکن است برای شخصی مدتی ثبت نشده باشد ( مدت Null باشد ) بهتر برای همچین رکوردهایی مدت صفر نمایش داده شود پس بجای Sum(modat)
بشکل زیر استفاده شود


Isnull(Sum(modat),0) As JModat

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

salmah
چهارشنبه 18 تیر 1393, 10:20 صبح
من به این صورت نوشتم ولی مجموع را نشون نمی ده و modat رابه صورت جدا جدا نشون


ALTER PROCEDURE sumoadat
@datastart nvarchar(50),
@dataend nvarchar(50)

AS
SELECT tuser.nam as nam, tuser.famil as famil, tsabtedoreh.datastart as datastart, tsabtedoreh.dataend as dataend,
tsabtedoreh.codepersoneli as codepersoneli , tuser.codepersoneli as codepersoneli , tsabtedoreh.accept as accept,Isnull(Sum(modat),0) as JModat
FROM tuser Left Outer JOIN
tsabtedoreh ON tuser.codepersoneli = tsabtedoreh.codepersoneli
WHERE tsabtedoreh.accept='True'AND (tsabtedoreh.datastart >= @datastart) AND (tsabtedoreh.dataend <= @dataend)

GROUP BY tuser.nam, tuser.famil, tsabtedoreh.datastart, tsabtedoreh.dataend, tsabtedoreh.nomreh,
tsabtedoreh.codepersoneli, tuser.codepersoneli,tsabtedoreh.accept,tsabtedoreh .modat

ORDER BY tsabtedoreh.datastart

RETURN

aslan
چهارشنبه 18 تیر 1393, 10:54 صبح
سلام
تمام فیلدهایی که در سلکت اوردین را باید در Group by بیارین بجز modat

salmah
چهارشنبه 18 تیر 1393, 12:19 عصر
درستش کردم ولی نتیجه به این صورت میشه:اشتباه:
120930

aslan
چهارشنبه 18 تیر 1393, 16:13 عصر
فیلدهای غیر ضروری از جمله : datastart,dataend,accept, ........ را از select , group by حذف کنید

وقتی این فیلدها باشه جمع مدت برای یک نفر برای هر تاریخ جداگانه محاسبه و نمایش داده میشود
مثلا :
مریم.... 1/1/93 50
مریم...... 11/2/93 30
و .....................

یعنی اطلاعات ( جمع مدت ) بر اساس تاریخ شروع / پایان / ....... نیز گروهبندی میشود که نیازی به انها ندارید و نتیجه کوئری چیزی غیر از اون خواهد شد که انتظار دارید و ................
اگر مشکلتون حل نشد کدهاتون را بزارید

salmah
چهارشنبه 18 تیر 1393, 22:19 عصر
واقعا ممنون از وقتی که می گذارید وجواب می دید
من با این دوتا پروسیجر یه نتیجه می گیرم و اون نمایش همه اعضا با مجموع ساعاتی که گذرونده اند

ALTER PROCEDURE sumoadat

AS
SELECT tuser.nam as nam, tuser.famil as famil, tsabtedoreh.codepersoneli as codepersoneli , tuser.codepersoneli as codepersoneli ,
tsabtedoreh.accept as accept,Isnull(Sum(modat),0) as JModat
FROM tuser Left Outer JOIN
tsabtedoreh ON tuser.codepersoneli = tsabtedoreh.codepersoneli
WHERE tsabtedoreh.accept='True'

GROUP BY tuser.nam, tuser.famil,
tsabtedoreh.codepersoneli, tuser.codepersoneli,tsabtedoreh.accept


و پروسیجر دیگه

ALTER PROCEDURE allmodat

AS
Select nam as nam,famil as famil,Sum(modat) as modat from tuser
Inner Join tsabtedoreh On tuser.codepersoneli=tsabtedoreh.codepersoneli
WHERE tsabtedoreh.accept='True'
Group By nam,famil
RETURN

salmah
چهارشنبه 18 تیر 1393, 22:23 عصر
خب الان میخوام یه پروسیجر بنویسم که این مقادیر را فیلتر کنه.
یعنی مجموع ساعات آموزشی گذرانده شده ی همه اعضا از بین تاریخ datastart و dataend نشون بده

aslan
چهارشنبه 18 تیر 1393, 23:20 عصر
خب الان میخوام یه پروسیجر بنویسم که این مقادیر را فیلتر کنه.
یعنی مجموع ساعات آموزشی گذرانده شده ی همه اعضا از بین تاریخ datastart و dataend نشون بده
خب قبلا توضیح دادم که : در پروسیجرها شرط های مربوط به تاریخ را بعد از Where قرار بدین ................

salmah
شنبه 21 تیر 1393, 00:25 صبح
در نهایت به این صورت شد ولی مشابه پاسخ #9 همون نتیجه را داره

ALTER PROCEDURE sumoadat

@datastart nvarchar(50),
@dataend nvarchar(50)


AS
SELECT tuser.nam as nam, tuser.famil as famil, tsabtedoreh.codepersoneli as codepersoneli ,
tuser.codepersoneli as codepersoneli ,
tsabtedoreh.accept as accept,Isnull(Sum(modat),0) as JModat
FROM tuser INNER JOIN
tsabtedoreh ON tuser.codepersoneli = tsabtedoreh.codepersoneli
WHERE tsabtedoreh.accept='True'AND (tsabtedoreh.datastart >= @datastart) AND (tsabtedoreh.dataend <= @dataend)

GROUP BY tuser.nam, tuser.famil,
tsabtedoreh.codepersoneli, tuser.codepersoneli,tsabtedoreh.accept

RETURN

aslan
شنبه 21 تیر 1393, 00:49 صبح
سلام
ببینید نتیجه پروسیجرزیر چیزیه که میخواین یا نه ؟


ALTER PROCEDURE sumoadat

@datastart nvarchar(10),
@dataend nvarchar(10)


AS
SELECT tuser.nam as nam
, tuser.famil as famil
,Isnull(Sum(modat),0) as JModat
FROM tuser INNER JOIN
tsabtedoreh ON tuser.codepersoneli = tsabtedoreh.codepersoneli
WHERE tsabtedoreh.accept='True' AND (tsabtedoreh.datastart >= @datastart) AND (tsabtedoreh.dataend <= @dataend)

GROUP BY tuser.nam, tuser.famil
RETURN