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 查询小计列的主要内容,如果未能解决你的问题,请参考以下文章