SQL将摘要行添加到MySQL结果集

时间:2015-09-16 15:19:34

标签: mysql sql resultset summary

如果我有一个MySQL表,例如:

enter image description here

我想使用SQL来计算PositiveResult列和NegativeResult列的总和。通常我只能在查询中执行SUM(PositiveResult)

但是,如果我想更进一步并将总数放在结果集底部的行中,该怎么办:

enter image description here

这可以在数据级别实现还是表示层问题?如果可以通过SQL完成,我该怎么做?我是一个SQL新手。

感谢受访者。我现在将与客户核实一下。

此外,是否可以添加文本列,以便最后一行数据的值不显示在摘要行中?像这样:

enter image description here

4 个答案:

答案 0 :(得分:4)

我也会在表示层执行此操作,但您可以执行MySQL ...

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,pos DECIMAL(5,2)
,neg DECIMAL(5,2)
);

INSERT INTO my_table VALUES
(1,0,0),
(2,1,-2.5),
(3,1.6,-1),
(4,1,-2);


SELECT COALESCE(id,'total') my_id,SUM(pos),SUM(neg) FROM my_table GROUP BY id WITH ROLLUP;

+-------+----------+----------+
| my_id | SUM(pos) | SUM(neg) |
+-------+----------+----------+
|     1 |     0.00 |     0.00 |
|     2 |     1.00 |    -2.50 |
|     3 |     1.60 |    -1.00 |
|     4 |     1.00 |    -2.00 |
|  total|     3.60 |    -5.50 |
+-------+----------+----------+
5 rows in set (0.02 sec)

这是修正问题的一个黑客 - 它不漂亮,但我认为它有效......

SELECT COALESCE(id,'') my_id
     , SUM(pos)
     , SUM(neg)
     , COALESCE(string,'') n
  FROM my_table 
 GROUP 
    BY id
     , string
  WITH ROLLUP
HAVING n <> '' OR my_id = ''
;

答案 1 :(得分:0)

select keyword,sum(positiveResults)+sum(NegativeResults)
from mytable
group by
Keyword

如果你需要绝对值put sum(abs(NegativeResults)

答案 2 :(得分:0)

这应该在SQL查询图层上方至少一层处理。

初始查询可以获取详细信息,然后应用程序层可以计算聚合(摘要行)。或者,可以使用第二次直接获取摘要的数据库调用(尽管这仅对汇总计算非常耗费资源并且确实需要第二次数据库调用的情况有效 - 大多数情况下应用程序层可以更有效地做到这一点。)

结果的排序/布局(即&#34;页脚&#34;摘要行后面的详细信息行)应在表示层处理。

答案 3 :(得分:0)

我建议在表示层执行此操作。在SQL中执行类似的操作也是可能的。

create table test (
  keywordid int, 
  positiveresult decimal(10,2), 
  negativeresult decimal(10,2)
);
insert into test values 
(1, 0, 0), (2, 1, -2.5), (3, 1.6, -1), (4, 1, -2);

select * from (
    select keywordid, positiveresult, negativeresult
    from test
      union all
    select null, sum(positiveresult), sum(negativeresult) from test
) main
order by
case when keywordid is null then 1000000 else keywordid end;

如果keywordid为null,我使用任意高的数字添加了排序,以确保视图可以轻松拉出有序记录集以进行显示。

Result:
+-----------+----------------+----------------+
| keywordid | positiveresult | negativeresult |
+-----------+----------------+----------------+
|         1 |           0.00 |           0.00 |
|         2 |           1.00 |          -2.50 |
|         3 |           1.60 |          -1.00 |
|         4 |           1.00 |          -2.00 |
|      NULL |           3.60 |          -5.50 |
+-----------+----------------+----------------+