Php 如何在SQL查询中创建一列的总和?

Php 如何在SQL查询中创建一列的总和?,php,sql,sql-server,sql-server-2014,Php,Sql,Sql Server,Sql Server 2014,我有一个包含多个列的表。我需要创建一个SQL查询,根据来自日期选择器和选择框的用户输入显示某些列。我做得很好。但是,我需要在显示表的底部合计一个结果列。我不知道如何在当前查询中创建结果以显示合计列。基本上,我希望WTTotal列被汇总到一个单独的单元格中。我目前的问题如下。我真的认为这是一件我似乎看不到的简单事情 SELECT REPLACE(Client,',',' ') AS Client,WorkTicketNum,Lease,Date,OrderedBy,WTTotal FROM Wo

我有一个包含多个列的表。我需要创建一个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 

你不能用一个查询就得到它。将
SUM()
放入查询需要一个
GROUPBY
子句,并将所有原始结果行向下折叠为一个结果行,这意味着表将消失。您需要的是客户端解决方案。e、 g.在您的客户代码中启动一个计数器,并手动添加结果。在伪代码中:

$sum = 0;
while( $row = fetch_from_db() ) {
   $sum += $row['field_to_sum'];
   display_row();
}
echo "Total: $sum";

你不能用一个查询就得到它。将
SUM()
放入查询需要一个
GROUPBY
子句,并将所有原始结果行向下折叠为一个结果行,这意味着表将消失。您需要的是客户端解决方案。e、 g.在您的客户代码中启动一个计数器,并手动添加结果。在伪代码中:

$sum = 0;
while( $row = fetch_from_db() ) {
   $sum += $row['field_to_sum'];
   display_row();
}
echo "Total: $sum";

如果要将其放在单独的列中,而不是单独的行中,可以在子查询中计算它并将其与结果关联:

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 

但实际上Kevin的解决方案非常好。

如果您想将它放在单独的列中,而不是单独的行中,您可以在子查询中计算它并将其与结果关联:

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 

但实际上凯文的解决方案非常好。

我也有与凯文类似的解决方案:

;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
但是这个解决方案只有在DB引擎支持CTE的情况下才能工作。
使用CTE,我们可以使用相同的结果集获得total的行。

我也有类似于Kevin的解决方案:

;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
但是这个解决方案只有在DB引擎支持CTE的情况下才能工作。
使用CTE,我们可以使用相同的resultset来获取total的行。

您使用的是什么DB引擎?是否希望每行都有一列显示总和?真奇怪。您正在使用支持公共表表达式的数据库吗?不,我不希望每行都有一列。本质上,我只希望WTTotal列中的最后一行是一个总和。对于那些需要这些信息的人,我使用的是SQL Server 2014和PHP。您使用的是什么数据库引擎?您希望每一行都有一列显示总和吗?真奇怪。您正在使用支持公共表表达式的数据库吗?不,我不希望每行都有一列。本质上,我只希望WTTotal列中的最后一行是一个总和。我正在使用SQL Server 2014和PHP,为那些需要这些信息的人服务。这是可以做到的,但根据其他答案,这非常尴尬。除非数据集非常庞大,否则最好在应用程序中进行求和。工会可以运作,但现在基本上只有三个问题。整个查询加上组成联合的两个子查询。它可以完成,但根据其他答案,它非常笨拙。除非数据集非常庞大,否则最好在应用程序中进行求和。工会可以运作,但现在基本上只有三个问题。整个查询加上组成union的两个子查询。我尝试使用它,但收到以下错误:“Msg 156,级别15,状态1,第5行关键字“union”附近的语法不正确。”@K3n5:SQL Server不幸不允许这样做。它需要将ORDER BY应用于整个查询,而不是单个子查询,这意味着总计行不会是最后一行。如果有人知道解决这个问题的方法,请随意修改答案。同时,OP可能应该使用一个客户端解决方案,如Marc B的答案。我尝试使用此解决方案,但收到以下错误:“Msg 156,级别15,状态1,第5行关键字“UNION”附近的语法不正确。”@K3n5:SQL Server不幸不允许这样做。它需要将ORDER BY应用于整个查询,而不是单个子查询,这意味着总计行不会是最后一行。如果有人知道解决这个问题的方法,请随意修改答案。同时,OP可能应该使用Marc B的答案那样的客户端解决方案。