Transact-SQL 查询小计列

Posted

技术标签:

【中文标题】Transact-SQL 查询小计列【英文标题】:Transact-SQL query subtotal column 【发布时间】:2015-11-16 01:51:30 【问题描述】:

当我的 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

可能吗?

【问题讨论】:

【参考方案1】:

使用窗口函数。

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

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

【讨论】:

【参考方案2】:

抱歉,我无法为您提供完整的查询,但如果您使用的是 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)

【讨论】:

【参考方案3】:
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 版本。

【讨论】:

【参考方案4】:

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

感谢 2005 年诞生的一些(窗口化)功能,这真的很容易。

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

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

不需要功能,不用它也能轻松搞定。

以上是关于Transact-SQL 查询小计列的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - 如何将带有组小计的列添加到查询结果中

您可以对数据透视表中的行和/或列进行小计吗?

sql server中的go

like小计

为聚合列添加小计列

如何使用 groupby 调整 pandas 中的小计列?