行之和与总行数和行数之差

时间:2012-01-30 15:42:50

标签: mysql

在sql select查询后,我得到的数组是写下来的那个,我希望在这个数组中添加一个sum(values)AS Total_Values列和sum(values) - 值AS Diff_Values列,I尝试了多种方式,但我没有做对的事

我当前查询的结果如下:

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 ; 

当然查询会返回更多显示的列。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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 ;

这个想法是,不是做差异,而是添加值。现在,如果在TMPTBL上运行SELECT查询,您将看到Diff_Values和Total_Values。请注意,我没有测试过程,但我认为它应该有效。

很少有事情需要注意:

  1. 我假设TMPTBL有一个id列
  2. 您无需在查询中计算Total_Values
  3. 表TMPTBL已存在并包含查询中除Total_Values
  4. 之外的所有列

    希望它有所帮助!