如何在SQL中的查询中创建一列的SUM?

时间:2014-11-10 14:50:48

标签: php sql sql-server sql-server-2014

我有一个包含多列的表。我需要创建一个SQL查询,以根据来自datepicker和select框的用户输入显示某些列。我做得很好。但是,我需要在显示表的底部总计一个结果列。我无法弄清楚如何在当前查询中创建结果以显示总计列。基本上,我希望将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 

4 个答案:

答案 0 :(得分:5)

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;

答案 1 :(得分:3)

您无法使用单个查询。将SUM()放入查询中需要GROUP BY子句,并将所有原始结果行折叠到单个结果行中 - 这意味着您的表将消失。您想要的是客户端解决方案。例如在客户端代码中启动计数器并手动添加结果。在伪代码中:

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

答案 2 :(得分:0)

如果您希望将其放在单独的列中,而不是在单独的行中,则可以在子查询中计算它并将其加入到结果中:

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 

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

答案 3 :(得分:0)

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

;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,我们可以使用相同的结果集来获得总行数。