PDA

View Full Version : جمع رکوردها توی کوئری گروه بندی شده



sh2007
چهارشنبه 28 دی 1390, 20:56 عصر
دوستان سلام
دو تا کوئری دارم که بدین صورت اونها رو گروه بندی کردم

SELECT Send.SendId, Send.Date, Takhfif.TotalSend, Takhfif.Takhfif
FROM Takhfif INNER JOIN
Send ON Takhfif.SendId = Send.SendId
GROUP BY Send.SendId, Send.Date, Takhfif.TotalSend, Takhfif.Takhfif
HAVING (Send.Date BETWEEN '1390/01/01' AND '1390/10/01')

نتیجه اجرای این sql اینه که
sendid senddate Takhfif.TotalSend Takhfif.Takhfif
2000 200000 1390/01/01 1
5000 400000 1390/01/01 2
6000 100000 1390/02/15 3
درصورتی که من این نتیجه رو می خوام
Takhfif.TotalSend Takhfif.Takhfif
13000 700000



حالا تنها چیزی که می خوام اینه که فیلد Takhfif.TotalSend, Takhfif.Takhfif رو جمع کلی داشته باشم چطوری sql اونو بنویسم
لطفا کمک کنید
ممنون

Galawij
پنج شنبه 29 دی 1390, 08:33 صبح
سلام،
این را امتحان کنید:
SELECT Send.SendId,Sum(Takhfif.TotalSend)AS TotalSend,SUM(Takhfif.Takhfif)AS Takhfif
FROM Takhfif INNER JOIN Send ON Takhfif.SendId = Send.SendId
GROUP BY Rollup (Send.SendId)
HAVING(Send.Date BETWEEN '1390/01/01' AND '1390/10/01')

pashna
پنج شنبه 29 دی 1390, 10:02 صبح
دوست من سلام، به نظر من در جواب‌ها چیزی که باید در نظر گرفته بشه، عملکرد بهینهٔ پرسجو است. مثلا یکی‌ از راه حل‌های این مساله میتونه این باشه :





WITH Temp AS (
SELECT Send.SendId, Send.Date, Takhfif.TotalSend, Takhfif.Takhfif
FROM Takhfif INNER JOIN
Send ON Takhfif.SendId = Send.SendId
GROUP BY Send.SendId, Send.Date, Takhfif.TotalSend, Takhfif.Takhfif
HAVING (Send.Date BETWEEN '1390/01/01' AND '1390/10/01')

)

SELECT SUM(TotalSend), SUM(Takhfif) FROM Temp



ولی‌ من شخصاً راه حال دوستمونو بیشتر می‌پسندم


Just in terms of performance

sh2007
پنج شنبه 29 دی 1390, 18:30 عصر
سلام،
این را امتحان کنید:
SELECT Send.SendId,Sum(Takhfif.TotalSend)AS TotalSend,SUM(Takhfif.Takhfif)AS Takhfif
FROM Takhfif INNER JOIN Send ON Takhfif.SendId = Send.SendId
GROUP BY Rollup (Send.SendId)
HAVING(Send.Date BETWEEN '1390/01/01' AND '1390/10/01')

این کد رو اجرا کردم پیغام خطا اومد دلیلش چیه دوستان

pashna
پنج شنبه 29 دی 1390, 23:05 عصر
دوست من سلام، دلیلش اینه که باید به جای HAVING از WHERE
کوئری رو به این صورت تغییر بدید. فکر کنم مشکلتون حل بشه


SELECT Send.SendId,Sum(Takhfif.TotalSend)AS TotalSend,SUM(Takhfif.Takhfif)AS Takhfif
FROM Takhfif INNER JOIN Send ON Takhfif.SendId = Send.SendId
WHERE(Send.Date BETWEEN '1390/01/01' AND '1390/10/01')
GROUP BY Rollup (Send.SendId)

sh2007
جمعه 30 دی 1390, 10:52 صبح
دوست من سلام، دلیلش اینه که باید به جای HAVING از WHERE
کوئری رو به این صورت تغییر بدید. فکر کنم مشکلتون حل بشه


SELECT Send.SendId,Sum(Takhfif.TotalSend)AS TotalSend,SUM(Takhfif.Takhfif)AS Takhfif
FROM Takhfif INNER JOIN Send ON Takhfif.SendId = Send.SendId
WHERE(Send.Date BETWEEN '1390/01/01' AND '1390/10/01')
GROUP BY Rollup (Send.SendId)



دوست من ممنون همونطوز که می بینید نتیجه نداد حتی اگه توی select ها هم sendid رو حذف کنم همه رو یکجا جمع نمی کنه

Galawij
جمعه 30 دی 1390, 22:36 عصر
منظورتون از همه را یکجا جمع نمی کنه چیه؟ می خواید جمع دو تا ستون را داشته باشید؟
SELECT Send.SendId,Sum(Takhfif.TotalSend)AS TotalSend,SUM(Takhfif.Takhfif)AS Takhfif,Sum(Takhfif.TotalSend)+SUM(Takhfif.Takhfif )AS FinalTotal ....