【问题标题】:Sum from rows and difference between total and rows行的总和以及总计和行之间的差
【发布时间】:2012-02-22 09:39:08
【问题描述】:

在 sql 选择查询之后,我得到的数组是写下来的数组,我想在这个数组中添加一个 sum(values) A​​S Total_Values 列和一个 sum(values) - values AS 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 ; 

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

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/q/5483319/535275
  • 您的查询和表架构是什么?
  • SELECT *, SUM(MINUTE(rest_time)) AS Times FROM 作为路由 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,报告.routes.departure_poi_code,reports.routes.car_no,reports.routes.departure_date ORDER BY routes.car_no LIMIT 500000 ;当然,查询会返回更多显示的列。

标签: mysql


【解决方案1】:

假设你的表名是 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;

【讨论】:

  • 虽然它对我来说没有多大意义,至少在我尝试之前不会,但它的查询写得很好。太棒了@lqez!
【解决方案2】:

这确实很难做到。我不知道如何在查询中做到这一点,但也许存储过程可能是一种方法。

假设您查询的以下结果集存储在名为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 之外的所有列

希望对你有帮助!

【讨论】:

  • 现在试一试,我会带着提要回来
猜你喜欢
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多