简体   繁体   English

如何获取SQL Server中行旁边的百分比值?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM