如何在 SQL 的查询中创建一列的 SUM?
Posted
技术标签:
【中文标题】如何在 SQL 的查询中创建一列的 SUM?【英文标题】:How can I create a SUM of one column within a query in SQL? 【发布时间】:2014-11-10 14:50:48 【问题描述】:我有一个包含多列的表。我需要创建一个 SQL 查询,以根据来自日期选择器和选择框的用户输入显示某些列。我做得很好。但是,我需要在显示表的底部汇总其中一个结果列。我无法弄清楚如何在当前查询中创建结果以显示总计列。本质上,我希望将 WTTotal 列汇总到一个单独的单元格中。我当前的查询如下。我真的认为这很简单,我似乎看不到。
SELECT REPLACE(Client,',',' ') AS Client,WorkTicketNum,Lease,Date,OrderedBy,WTTotal
FROM WorkTicket
WHERE Date BETWEEN '2014-10-01' AND '2014-10-31' AND Invoiced IS NULL
ORDER BY Client
【问题讨论】:
你使用的是什么数据库引擎? 您希望每一行都有一列显示总和?这很奇怪。您使用的是支持公用表表达式的数据库吗? 不,我不希望每一行都有一列。本质上,我只希望 WTTotal 列中的最后一行是 SUM。我正在使用 SQL Server 2014 和 php,对于那些想要这些信息的人。 【参考方案1】:SELECT REPLACE(Client,',',' ') AS Client,WorkTicketNum,Lease,Date,OrderedBy,WTTotal
FROM WorkTicket
WHERE Date BETWEEN '2014-10-01' AND '2014-10-31' AND Invoiced IS NULL
ORDER BY Client
UNION ALL
SELECT 'Total', NULL, NULL, NULL, NULL, SUM(WTTotal)
FROM WorkTicket
WHERE Date BETWEEN '2014-10-01' AND '2014-10-31' AND Invoiced IS NULL;
【讨论】:
我尝试使用它,但收到以下错误:“Msg 156, Level 15, State 1, Line 5 关键字'UNION'附近的语法不正确。” @K3n5:很遗憾,SQL Server 不允许这样做。它要求ORDER BY
应用于整个查询,而不是单个子查询,这意味着总计行不会是最后一行。如果有人知道解决此问题的方法,请随时修复答案。与此同时,OP 可能应该使用像 Marc B's answer 这样的客户端解决方案。【参考方案2】:
您无法通过单个查询获得它。将SUM()
放入您的查询将需要GROUP BY
子句并将所有原始结果行折叠成一个结果行 - 这意味着您的表将消失。您想要的是客户端解决方案。例如在您的客户端代码中启动一个计数器并手动将结果相加。在伪代码中:
$sum = 0;
while( $row = fetch_from_db() )
$sum += $row['field_to_sum'];
display_row();
echo "Total: $sum";
【讨论】:
可以做到,但根据其他答案,这很尴尬。除非数据集非常庞大,否则最好在应用程序中进行求和。 确实如此。工会可以工作,但现在基本上是三个查询。整个查询加上组成联合的两个子查询。【参考方案3】:如果您想将它放在单独的列中,而不是单独的行中,您可以在子查询中计算它并将其连接到您的结果中:
SELECT REPLACE(Client,',',' ') AS Client,WorkTicketNum,Lease,Date,OrderedBy, my_calculated_sum AS WTTotal
FROM WorkTicket
JOIN (SELECT SUM(whatever_you_want_to_sum) as my_calculated_sum FROM WorkTicket) subquery_alias
WHERE Date BETWEEN '2014-10-01' AND '2014-10-31' AND Invoiced IS NULL
ORDER BY Client
或者你只是用变量来计算它,比如一个运行总计。您的结果在该列的最后一行。
SELECT REPLACE(Client,',',' ') AS Client,WorkTicketNum,Lease,Date,OrderedBy, @sum_variable := @sum_variable + whatever_you_want_to_sum AS WTTotal
FROM WorkTicket
, (SELECT @sum_variable := 0) var_init_subquery
WHERE Date BETWEEN '2014-10-01' AND '2014-10-31' AND Invoiced IS NULL
ORDER BY Client
但实际上凯文的解决方案非常好。
【讨论】:
【参考方案4】:我也有和凯文类似的解决方案:
;with cte_result
as
(
SELECT REPLACE(Client,',',' ') AS Client,WorkTicketNum,Lease,Date,OrderedBy,WTTotal
FROM WorkTicket
WHERE Date BETWEEN '2014-10-01' AND '2014-10-31' AND Invoiced IS NULL
)
select *
from cte_result
union
select 'TotalAmount',NULL,NULL,NULL,NULL,sum(WTTotal)
from cte_result
order by client
但此解决方案仅在您的数据库引擎支持 CTE 时才有效。 使用 CTE,我们可以使用相同的结果集来获取总计的行。
【讨论】:
以上是关于如何在 SQL 的查询中创建一列的 SUM?的主要内容,如果未能解决你的问题,请参考以下文章