SQL 将摘要行添加到 MySQL 结果集
SQL to add a summary row to MySQL result set
如果我有 MySQL table 例如:
我想使用 SQL 来计算 PositiveResult
列和 NegativeResult
列的总和。通常我可以简单地在查询中做 SUM(PositiveResult)
。
但是,如果我想更进一步,将总计放在结果集底部的一行中怎么办:
这可以在数据级别实现还是表示层问题?如果 SQL 可以完成,我该怎么做?我有点SQL新手。
感谢受访者。我现在会和客户核实一下。
另外,能否添加一个文本列,使最后一行数据的值不显示在摘要行中?像这样:
select keyword,sum(positiveResults)+sum(NegativeResults)
from mytable
group by
Keyword
如果您需要绝对值,请输入 sum(abs(NegativeResults)
这应该在 SQL 查询层之上至少处理一层。
初始查询可以获取详细信息,然后应用层可以计算聚合(汇总行)。或者,可以使用第二个 db 调用直接获取摘要(尽管这仅适用于摘要计算非常耗费资源并且确实需要第二个 db 调用的情况 - 大多数时候是应用程序层可以更有效地做到这一点)。
结果的 ordering/layout(即详细信息行后跟 "footer" 摘要行)应在表示层处理。
我建议在表示层执行此操作。在 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 为空,我使用任意高的数字添加排序,以确保视图可以轻松拉取排序的记录集以进行显示。
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 |
+-----------+----------------+----------------+
我也会在表示层执行此操作,但您可以执行此操作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 = ''
;
如果我有 MySQL table 例如:
我想使用 SQL 来计算 PositiveResult
列和 NegativeResult
列的总和。通常我可以简单地在查询中做 SUM(PositiveResult)
。
但是,如果我想更进一步,将总计放在结果集底部的一行中怎么办:
这可以在数据级别实现还是表示层问题?如果 SQL 可以完成,我该怎么做?我有点SQL新手。
感谢受访者。我现在会和客户核实一下。
另外,能否添加一个文本列,使最后一行数据的值不显示在摘要行中?像这样:
select keyword,sum(positiveResults)+sum(NegativeResults)
from mytable
group by
Keyword
如果您需要绝对值,请输入 sum(abs(NegativeResults)
这应该在 SQL 查询层之上至少处理一层。
初始查询可以获取详细信息,然后应用层可以计算聚合(汇总行)。或者,可以使用第二个 db 调用直接获取摘要(尽管这仅适用于摘要计算非常耗费资源并且确实需要第二个 db 调用的情况 - 大多数时候是应用程序层可以更有效地做到这一点)。
结果的 ordering/layout(即详细信息行后跟 "footer" 摘要行)应在表示层处理。
我建议在表示层执行此操作。在 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 为空,我使用任意高的数字添加排序,以确保视图可以轻松拉取排序的记录集以进行显示。
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 |
+-----------+----------------+----------------+
我也会在表示层执行此操作,但您可以执行此操作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 = ''
;