View Full Version : جمع رکوردها توی کوئری گروه بندی شده
  
sh2007
چهارشنبه 28 دی 1390, 21: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, 09: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, 11: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, 19: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
جمعه 30 دی 1390, 00: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, 11: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, 23:36 عصر
منظورتون از همه را یکجا جمع نمی کنه چیه؟ می خواید جمع دو تا ستون را داشته باشید؟
SELECT    Send.SendId,Sum(Takhfif.TotalSend)AS TotalSend,SUM(Takhfif.Takhfif)AS Takhfif,Sum(Takhfif.TotalSend)+SUM(Takhfif.Takhfif )AS FinalTotal ....
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.