2012-01-30 63 views
2

經過一個sql select查詢後,我得到的數組是一個寫下來的數組,我想添加一個sum(values)AS Total_Values列和一個sum(值) - 值Diff_Values專欄中,我試過多種方法,但我沒有得到正確的事從行和總和與行之差

我當前查詢的結果是一樣的東西:

Car_Number Start_time Code_nr Values Total_Values 
BH-07-EWR 08:59:00 C00425 7000 44400 
BH-07-EWR 10:29:00 C00149 8500 44400 
BH-07-EWR 14:27:00 C01075 9200 44400 
BH-07-EWR 15:07:00 C00305 9800 44400 
BH-07-EWR 16:08:00 C02572 9900 44400 

而且我想它是:

Car_Number Start_time Code_nr Values Total_Values Diff_Values 
BH-07-EWR 08:59:00 C00425 7000 44400   44400 
BH-07-EWR 10:29:00 C00149 8500 44400   37400 
BH-07-EWR 14:27:00 C01075 9200 44400   28900 
BH-07-EWR 15:07:00 C00305 9800 44400   19700 
BH-07-EWR 16:08:00 C02572 9900 44400   9900 

我該如何做到這一點?事情可能看起來很簡單,但經過一些更復雜的經驗。由於

更新:

例如,SQL:

SELECT *, SUM(MINUTE(rest_time)) AS Times FROM routes as routes 
LEFT JOIN sales ON (routes.departure_poi_code = sales.client_code 
       AND routes.departure_date = sales.date) 
WHERE (routes.departure_poi_code LIKE 'C0%' 
     OR routes.departure_poi_code LIKE 'MP%') 
     AND routes.car_no = 'BH-07-EWR' 
     AND routes.departure_date = '2011-10-14' 
GROUP BY routes.departure_address, reports.routes.departure_poi_code, reports.routes.car_no, reports.routes.departure_date 
ORDER BY routes.car_no LIMIT 500000 ; 

當然,查詢返回呈現了更多的列。

+0

這可能有所幫助:http://stackoverflow.com/q/5483319/535275 – 2012-01-30 15:55:50

+0

什麼是您的查詢和表模式? – Abhay 2012-01-30 16:04:57

+0

SELECT *,SUM(MINUTE(rest_time))隨着時代的 FROM路線作爲路線 LEFT JOIN銷售 ON(routes.departure_poi_code = sales.client_code AND routes.departure_date = sales.'date') WHERE(routes.departure_poi_code像'C0%'或路線。ANDRE routes.'car_no' ='BH-07-EWR' AND routes.departure_date ='2011-10-14' GROUP BY routes.departure_address,reports.routes.departure_poi_code, reports .routes.car_no,reports.routes.departure_date ORDER BY routes.car_no LIMIT 500000;當然,querry會返回更多的colums。 – 2012-01-30 16:27:36

回答

3

假設你的表名是TBL。

SELECT TBL.*, Total_Values, @R:=IF(@R=0, Total_Values, @R-TBL.`Values`) AS Diff_Values 
    FROM TBL, (SELECT @R:=0, SUM(`Values`) AS Total_Values FROM TBL) x; 
+0

雖然它對我來說沒有多大意義,但至少在我試用之前,不過它是一個寫得很好的查詢。很棒@lqez! – Abhay 2012-01-31 02:40:46

+0

@Abhay非常感謝! – lqez 2012-01-31 04:48:10

0

這的確很棘手。我無法弄清楚如何在查詢中做到這一點,但也許存儲過程可能是一種方式。

假設查詢中的以下結果集存儲在名爲TMPTBL的中間表中,其中每行都由唯一的ID標識。所以TMPTBL看起來就像這樣:

id Car_Number Start_time Code_nr Values 
1 BH-07-EWR 08:59:00 C00425 7000 
2 BH-07-EWR 10:29:00 C00149 8500 
3 BH-07-EWR 14:27:00 C01075 9200 
4 BH-07-EWR 15:07:00 C00305 9800 
5 BH-07-EWR 16:08:00 C02572 9900 

請注意,您不需要計算Total_Values該工作將作爲存儲過程的一部分。

現在下面創建一個過程:

DELIMITER ;; 
CREATE PROCEDURE spCompute() 
BEGIN 
    DECLARE idn INT; 
    DECLARE vals INT; 
    DECLARE totVals INT DEFAULT 0; 
    DECLARE noData INT DEFAULT FALSE; 
    DECLARE csrData CURSOR FOR SELECT `id`, `Values` FROM `TMPTBL` ORDER BY `id` DESC; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET noData = TRUE; 

    OPEN csrData; 
    startLoop: LOOP 
     FETCH csrData INTO idn, vals; 
     IF noData THEN 
      LEAVE startLoop; 
     END IF; 
     SET totVals = totVals + vals; 
     UPDATE `TMPTBL` SET `Diff_Values` = totVals WHERE `id` = idn; 
    END LOOP; 
    UPDATE `TMPTBL` SET `Total_Values` = totVals; 
    CLOSE csrData; 
END;; 
DELIMITER ; 

的想法是,而不是做的diff文件,程序將添加值來代替。現在,如果您在TMPTBL上運行SELECT查詢,您將看到Diff_Values和Total_Values。請注意,我沒有測試過程,但我認爲它應該起作用。

幾點需要注意:

  1. 我認爲TMPTBL有一個id列
  2. ,你並不需要在查詢
  3. 該表TMPTBL已經存在,並且包含了所有計算Total_Values除Total_Values以外的列查詢列

希望它有幫助!

+0

現在嘗試,我會回來與飼料 – 2012-01-30 20:01:03

+0

謝謝,真的很有幫助。 – 2012-01-30 21:32:05