2011-04-26 338 views
0

HI 我有一個表listsing_prices(ID,listing_id,day_from,day_to,價格) 我需要計算在MySQL的假期的總成本becouse我需要的總費用對結果進行排序。MySQL查詢來計算總成本

EX:

VALUES IN TABLE 
1 6 2011-04-27 2011-04-30 55,00 
2 6 2011-05-01 2011-05-02 60,00 
3 6 2011-05-03 2011-05-15 65,00 

假日從2011-04-28到2011-05-05的總成本= 480

+0

如果假期不相鄰的(如'04-27'到'04-29'),你想在結果集中記錄一個或兩個記錄嗎? – Quassnoi 2011-04-26 12:09:28

+0

有了這些值,你如何得到總成本爲480? – judda 2011-04-26 12:10:53

+0

一個紀錄結果 – Igor 2011-04-26 12:14:05

回答

0

沒有創建一個實際的表來表示從開始日期到結束日期的每一天,您可以使用mysql查詢變量。第一個查詢可以加入到任何表格中,只要它具有與您關注的節日期間一樣多的記錄......在這種情況下,從4月28日到5月5日爲止的8天。通過執行笛卡爾並將其限制爲8本質上,將創建一個臨時結果集,每天有一條記錄,從2011/04/28(您的開始日期)開始。

然後,將其加入回到你的價格表匹配的日期期間並總結匹配價格總成本...

select 
     sum(pt.price) as TotalCosts 
    from 
     (SELECT 
       @r:= date_add(@r, interval 1 day) CalendarDate 
      FROM 
       (select @r := STR_TO_DATE('2011/04/28', '%Y/%m/%d')) vars, 
       AnyTableWithAtLeast8ays limit 8) JustDates, 
     PricesTable pt 
    where 
     JustDates.CalendarDate between pt.date_from and pt.date_to 
+0

AnyTableWithAtLeast8ays – Igor 2011-04-27 11:28:35

+0

@Igor,我想你已經想通了......它可以是任何你有的表,但它必須有多少天,因爲你期望計算成本前進...如果你想要成本爲30天,只要確保所引用的表有許多記錄...它只是強制笛卡爾結果集。 – DRapp 2011-04-27 12:37:25

0
select count(price) from listing_prices where day_from >= '2011-04-28' and day_to <= '2011-05-05' 
+0

'count'?我認爲你的意思是'總和'?但即使這樣也不能給出正確的答案。 – 2011-04-26 12:28:02

+0

是的,在這種情況下,使用COUNT和SUM都是有意義的。 – judda 2011-04-26 12:46:44

0
-- This will provide a list of ids along with how many days fall between the two 
SELECT a.id, DATEDIFF(DAYS, CASE WHEN day_from < '2011-04-28' THEN '2011-04-28' ELSE day_from END CASE, day_to) AS DayCount 
FROM listing_prices a 
WHERE '2011-04-28' BETWEEN a.date_from AND a.date_to 
    AND a.date_to <= '2011-05-05' 

-- Based on the previous query, sum the number of days within the range 
SELECT SUM(a.price * b.DayCount) AS Total 
FROM listing_prices a 
JOIN (SELECT a.id, DATEDIFF(DAYS, CASE WHEN day_from < '2011-04-28' THEN '2011-04-28' ELSE day_from END CASE, day_to) AS DayCount 
FROM listing_prices a 
WHERE '2011-04-28' BETWEEN a.date_from AND a.date_to 
    AND a.date_to <= '2011-05-05' 

)B關於a.id = b.id

請注意,這是未經測試...頂部的查詢我相信應該可以工作,但如果它沒有,它可以被修改,以便它可以工作(獲取數量每個範圍內的天數),然後直接複製並粘貼到第二個查詢的子查詢中。第二個查詢是您實際使用的查詢。