如何从MySQL为每n条记录求和

如何从MySQL为每n条记录求和,sql,mysql,Sql,Mysql,我从查询中得到以下结果: +---------------+------+------+------+------+------+------+------+-------+ | order_main_id | S36 | S37 | S38 | S39 | S40 | S41 | S42 | total | +---------------+------+------+------+------+------+------+------+-------+ |

我从查询中得到以下结果:

+---------------+------+------+------+------+------+------+------+-------+
| order_main_id | S36  | S37  | S38  | S39  | S40  | S41  | S42  | total |
+---------------+------+------+------+------+------+------+------+-------+
|            26 |  127 |  247 |  335 |  333 |  223 |  111 |   18 |  1394 | 
|            26 |  323 |  606 |  772 |  765 |  573 |  312 |  154 |  3505 | 
|            38 |   25 |   35 |   35 |   35 |   20 | NULL | NULL |   150 | 
|            38 |   25 |   35 |   35 |   35 |   20 | NULL | NULL |   150 | 
|            39 |   65 |   86 |   86 |   42 |   21 | NULL | NULL |   300 | 
|            39 |   42 |   58 |   58 |   28 |   14 | NULL | NULL |   200 | 
|            35 |   11 |   20 |   21 |   18 |    9 |    2 | NULL |    81 | 
|            35 |   10 |   25 |   30 |   23 |   12 |    1 | NULL |   101 | 
+---------------+------+------+------+------+------+------+------+-------+
我想在输入不同的
order\u main\u id
之前插入一个总和,结果如下:

+---------------+------+------+------+------+------+------+------+-------+
| order_main_id | S36  | S37  | S38  | S39  | S40  | S41  | S42  | total |
+---------------+------+------+------+------+------+------+------+-------+
|            26 |  127 |  247 |  335 |  333 |  223 |  111 |   18 |  1394 | 
|            26 |  323 |  606 |  772 |  765 |  573 |  312 |  154 |  3505 |
|               |  450 |  853 | 1107 | 1098 |  796 |  423 |  172 |  4899 | 
|            38 |   25 |   35 |   35 |   35 |   20 | NULL | NULL |   150 | 
|            38 |   25 |   35 |   35 |   35 |   20 | NULL | NULL |   150 |
|               |   50 |   70 |   70 |   70 |   40 | NULL | NULL |   300 | 
|            39 |   65 |   86 |   86 |   42 |   21 | NULL | NULL |   300 | 
|            39 |   42 |   58 |   58 |   28 |   14 | NULL | NULL |   200 |
|               |  107 |  144 |  144 |   70 |   35 | NULL | NULL |   500 | 
|            35 |   11 |   20 |   21 |   18 |    9 |    2 | NULL |    81 | 
|            35 |   10 |   25 |   30 |   23 |   12 |    1 | NULL |   101 |
|               |   21 |   45 |   51 |   41 |   21 |    3 | NULL |   182 | 
+---------------+------+------+------+------+------+------+------+-------+

如何做到这一点?

您需要编写第二个查询,该查询使用GROUP BY order\u main\u id

比如:

SELECT sum(S41+...) FROM yourTable GROUP BY orderMainId

K

您实际上可以在一个查询中完成这项工作,但是使用
联合all
(实际上是两个查询,但是结果集被组合成一个很棒的结果集):

请记住,
order by
影响整个
union all
,而不仅仅是最后一个查询。因此,您的结果集如下所示:

+---------------+------+------+------+------+------+------+------+-------+---------+
| order_main_id | S36  | S37  | S38  | S39  | S40  | S41  | S42  | total | rowtype |
+---------------+------+------+------+------+------+------+------+-------+---------+
|            26 |  127 |  247 |  335 |  333 |  223 |  111 |   18 |  1394 | Detail  |
|            26 |  323 |  606 |  772 |  765 |  573 |  312 |  154 |  3505 | Detail  |
|            26 |  450 |  853 | 1107 | 1098 |  796 |  423 |  172 |  4899 | Summary |
|            35 |   11 |   20 |   21 |   18 |    9 |    2 | NULL |    81 | Detail  |
|            35 |   10 |   25 |   30 |   23 |   12 |    1 | NULL |   101 | Detail  |
|            35 |   21 |   45 |   51 |   41 |   21 |    3 | NULL |   182 | Summary |
|            38 |   25 |   35 |   35 |   35 |   20 | NULL | NULL |   150 | Detail  |
|            38 |   25 |   35 |   35 |   35 |   20 | NULL | NULL |   150 | Detail  |
|            38 |   50 |   70 |   70 |   70 |   40 | NULL | NULL |   300 | Summary |
|            39 |   65 |   86 |   86 |   42 |   21 | NULL | NULL |   300 | Detail  |
|            39 |   42 |   58 |   58 |   28 |   14 | NULL | NULL |   200 | Detail  |
|            39 |  107 |  144 |  144 |   70 |   35 | NULL | NULL |   500 | Summary |
+---------------+------+------+------+------+------+------+------+-------+---------+

这样,您就知道什么是详细信息行或摘要行,什么不是详细信息行或摘要行,以及它的
order\u main\u id
。您可以随时(也可能应该)在演示层中隐藏此列。

对于类似的内容,我认为您应该使用报告库(如Crystal Reports),这将为您节省很多麻烦,请检查

是的,我按照您的建议进行了第二次查询,这就是a获得这些值的原因。但我想通过一个查询来实现这一点。有什么想法吗?没有,据我所知,一个问题是不可能做到的。您可以通过编写一个存储过程来实现这一点,该过程用两个查询的结果填充一个临时表,以获得所需的输出。感谢KB22,这对我来说是一个亮点,这是不可能的。这是绝对可能的,而不是您需要循环或执行临时表的内容。事实上,这是解决这个问题的非常非常糟糕的建议。只要使用一个
联合所有人
,生活就会美好!KB22,你仍然是最好的。第二个结果不是来自一个查询,而是我手动插入的hand@OP:真的吗?伙计,我很抱歉!这确实有效。由于S36到S42是UNION ALL之前的另一个和的别名,这些别名在UNION ALL之后不会被识别,所以我需要再次进行别名,行类型是genius加法。非常感谢埃里克。
+---------------+------+------+------+------+------+------+------+-------+---------+
| order_main_id | S36  | S37  | S38  | S39  | S40  | S41  | S42  | total | rowtype |
+---------------+------+------+------+------+------+------+------+-------+---------+
|            26 |  127 |  247 |  335 |  333 |  223 |  111 |   18 |  1394 | Detail  |
|            26 |  323 |  606 |  772 |  765 |  573 |  312 |  154 |  3505 | Detail  |
|            26 |  450 |  853 | 1107 | 1098 |  796 |  423 |  172 |  4899 | Summary |
|            35 |   11 |   20 |   21 |   18 |    9 |    2 | NULL |    81 | Detail  |
|            35 |   10 |   25 |   30 |   23 |   12 |    1 | NULL |   101 | Detail  |
|            35 |   21 |   45 |   51 |   41 |   21 |    3 | NULL |   182 | Summary |
|            38 |   25 |   35 |   35 |   35 |   20 | NULL | NULL |   150 | Detail  |
|            38 |   25 |   35 |   35 |   35 |   20 | NULL | NULL |   150 | Detail  |
|            38 |   50 |   70 |   70 |   70 |   40 | NULL | NULL |   300 | Summary |
|            39 |   65 |   86 |   86 |   42 |   21 | NULL | NULL |   300 | Detail  |
|            39 |   42 |   58 |   58 |   28 |   14 | NULL | NULL |   200 | Detail  |
|            39 |  107 |  144 |  144 |   70 |   35 | NULL | NULL |   500 | Summary |
+---------------+------+------+------+------+------+------+------+-------+---------+