Transact-SQL查询小计列

时间:2015-11-16 01:51:31

标签: sql sql-server tsql subtotal

当我的sql查询返回结果时,它看起来像这样:

Driver    Amount
A         $120.00
A          -$5.00
A          $10.00
B          $90.00

但是现在我被要求在查询结果中添加一列,以显示每个驱动程序的总数。所以它现在应该是这样的:

Driver          Amount       Subtotal
A              $120.00        $125.00
A               -$5.00        $125.00
A               $10.00        $125.00
B               $90.00         $90.00

可能的?

5 个答案:

答案 0 :(得分:3)

使用窗口功能。

with cte as (
      <your query here>
     )
select cte.*,
       sum(amount) over (partition by driver) as subtotal
from cte;

您可以将此逻辑直接合并到返回第一个结果的查询中。

答案 1 :(得分:0)

很抱歉,我无法为您提供完整的查询,但如果您使用的是MS SQL,以下链接可能有助于您完成GROUP BY和ROLLUP所需的工作。

https://technet.microsoft.com/en-us/library/bb522495(v=sql.105).aspx

另一种方法是使用CTE(公用表表达式)

With cteName as (
    Select DriverId,
    Sum(DriverAmount) As TotalDriverAmount
    FROM YourTable
    GROUP BY DriverId
),
Select YourTable.DriverId, DriverAmount, cteName.TotalDriverAmount
FROM YourTable LEFT JOIN cteName ON(cteName.DriverId = YourTable.DriverId)

答案 2 :(得分:0)

SELECT T.DRIVER, T.AMOUNT, S.TOT [SUBTOTAL] FROM YOURTABLE T JOIN 
(SELECT DRIVER, SUM(AMOUNT) TOT FROM YOURTABLE GROUP BY DRIVER ) S 
ON T.DRIVER = S.DRIVER

这应该适用于任何MS-SQL版本。

答案 3 :(得分:0)

来自 https://www.sqlservercentral.com/Forums/Topic1541134-3412-1.aspx

这很容易,这要归功于2005年诞生的某些(Windowing)功能。

SELECT  OrderNo
        ,Something
        ,Amount
        ,SubTotal = SUM(Amount) OVER (PARTITION BY OrderNo)    
FROM #TestTable   
ORDER BY OrderNo, Something

答案 4 :(得分:-2)

创建一个获取驱动程序ID,查询驱动程序数据和返回总计的函数,在查询中调用该函数

Select DriverId, Amount, func(driverId) as TotalAmount
FROM Table

    function func(ID){
   return(Select sum(amount) from table where driverid=ID);
    }