[英]How do I get the percentage value next to row in SQL Server?
I have following query which returns top 50 SUM(DetailTins)
records. 我有以下查询,返回top 50 SUM(DetailTins)
记录。 I need to have another column which show the percentage of SUM(DetailTins)
over all records in the table not only first 50. 我需要有另一列显示表中所有记录的SUM(DetailTins)
百分比,而不仅是前50个。
What do I need to modify in following query? 在以下查询中我需要修改什么?
Also I am using SQL Server 2008 R2 so I cannot use Over partition by
function. 另外,我正在使用SQL Server 2008 R2,因此无法使用Over partition by
功能Over partition by
。
WITH CTE AS
(
SELECT
ID, Name, City, State, SUM(DetailTins) AS SumTins
FROM
FeedRpts
WHERE
(RptTimeFrame BETWEEN @BeginDate AND @EndDate)
AND ((@VALUE = 'TN' AND STATE = 'TN')
OR (@VALUE = 'OOS' AND STATE <> 'TN')
OR (@VALUE = 'ALL'))
GROUP BY
ID, Name, City, State
)
SELECT TOP 50 *
FROM CTE
ORDER BY SumTins DESC
You can introduce another variable to calculate total sum, and then use this variable to calculate percentage: 您可以引入另一个变量来计算总和,然后使用此变量来计算百分比:
DECLARE @TotalTins INT
SELECT @TotalTins = SUM(DetailTins) FROM FeedRpts
WHERE (RptTimeFrame BETWEEN @BeginDate AND @EndDate) AND ((@VALUE = 'TN' AND STATE = 'TN') OR (@VALUE = 'OOS' AND STATE <> 'TN') OR (@VALUE = 'ALL'))
WITH CTE
AS
(
SELECT ID, Name, City, State, SUM(DetailTins) AS SumTins
FROM FeedRpts
WHERE (RptTimeFrame BETWEEN @BeginDate AND @EndDate) AND ((@VALUE = 'TN' AND STATE = 'TN') OR (@VALUE = 'OOS' AND STATE <> 'TN') OR (@VALUE = 'ALL'))
GROUP BY ID, Name, City, State
)
SELECT TOP 50 *, CAST(SumTins AS float) / CAST(@TotalTins AS float) AS Percentage
FROM CTE ORDER BY SumTins DESC
declare @ssum int = (select SUM(DetailTins) AS SumTins from FeedRpts);
WITH CTE
AS
(
SELECT ID, Name, City, State, SUM(DetailTins) AS SumTins
FROM FeedRpts
WHERE (RptTimeFrame BETWEEN @BeginDate AND @EndDate)
AND ( (@VALUE = 'TN' AND STATE = 'TN')
OR (@VALUE = 'OOS' AND STATE <> 'TN')
OR (@VALUE = 'ALL')
)
GROUP BY ID, Name, City, State
)
SELECT TOP (50) *, @ssum as ssum, 100.0 * SumTins / @ssum as [pct]
FROM CTE
ORDER BY SumTins DESC
Add a nested subquery in your SELECT statement. 在您的SELECT语句中添加一个嵌套的子查询。 I don't think you even need the CTE in this, but since you've already written it, I'll just add the subquery. 我认为您甚至不需要CTE,但是由于您已经编写了CTE,所以我只添加子查询。
WITH CTE
AS
(
SELECT ID, Name, City, State, SUM(DetailTins) AS SumTins
FROM FeedRpts
WHERE (RptTimeFrame BETWEEN @BeginDate AND @EndDate) AND ((@VALUE = 'TN' AND STATE = 'TN') OR (@VALUE = 'OOS' AND STATE <> 'TN') OR (@VALUE = 'ALL'))
GROUP BY ID, Name, City, State
)
SELECT TOP 50 *, (SELECT SumTins FROM CTE) AS AllRecordSumTins FROM CTE ORDER BY SumTins DESC
You may need to SUM that within the subquery: (SELECT Sum(SumTins) FROM CTE) AS AllRecordSumTins 您可能需要在子查询中求和:(SELECT Cum(SumTins)from CTE)AS AllRecordSumTins
See my changes of your query below: 在下面查看我对查询的更改:
SELECT
ID, Name, City, State,
SUM(DetailTins) AS SumTins,
SUM(DetailTins) / (SELECT SUM(DetailTins) FROM FeedRpts) * 100 AS Percent_of_Total
FROM
FeedRpts
WHERE
(RptTimeFrame BETWEEN @BeginDate AND @EndDate)
AND ((@VALUE = 'TN' AND STATE = 'TN') OR
(@VALUE = 'OOS' AND STATE <> 'TN') OR (@VALUE = 'ALL'))
GROUP BY
ID, Name, City, State
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.