SQL 运行 总计或 运行 总计的 Case 语句

SQL Running total or Case statement on a running total

我有一个如下所示的查询:

SELECT b.HH,
       b.TotalRevenues,
       b.TotalOperatingExpenses,
       b.TotalAUA,
       (b.TotalRevenues -b.TotalOperatingExpenses) AS Profit,
       ((b.TotalRevenues -b.TotalOperatingExpenses)/sum((b.TotalRevenues -b.TotalOperatingExpenses))) AS percentProfit FROM
  ( SELECT * FROM
     (SELECT CASE
                 WHEN (LTRIM(RTRIM(v.ISM_HH_KEY)) <> '')--OR
 --(LTRIM(RTRIM(v.ISM_HH_KEY)) IS NOT NULL)
 THEN LTRIM(RTRIM(v.ISM_HH_KEY))
                 ELSE LEFT(LTRIM(RTRIM(v.ACCOUNT)), 6)
             END AS 'HH', [WealthDB].[dbo].[WF_PM_SUM_DB].account AS 'Account', (sum(DB_1_1) + sum(DB_1_2) + sum(DB_1_3) + sum(DB_1_5) + sum(DB_2_1_1) + sum(DB_2_1_2) + sum(DB_2_2_1) + sum(DB_2_2_2)+SUM(DB_3_1)) AS 'TotalRevenues', SUM(DB_4) AS 'TotalOperatingExpenses', AVG(DB_10) AS 'TotalAUA'
      FROM [WealthDB].[dbo].[WF_PM_SUM_DB]
      INNER JOIN
        (SELECT DISTINCT ISM_HH_Key, account, Municipality
         FROM [WealthDB].[dbo].[WF_PM_ACCT_det_DB] ) AS v ON [WealthDB].[dbo].[WF_PM_SUM_DB].Account = v.Account
      WHERE [WealthDB].[dbo].[WF_PM_SUM_DB].yearmonth > '201512'
      GROUP BY v.account, V.ISM_HH_Key,[WealthDB].[dbo].[WF_PM_SUM_DB].account, v.Municipality --   (
 ) a
   GROUP BY a.HH, a.Account, a.HH, a.TotalRevenues, a.TotalOperatingExpenses,a.TotalAUA
   HAVING a.TotalAUA > 0
   AND a.TotalRevenues>0 ) b
GROUP BY b.HH,
         b.TotalRevenues,
         b.TotalOperatingExpenses,
         b.TotalAUA
HAVING (b.TotalRevenues -b.TotalOperatingExpenses) > 0
ORDER BY profit ASC

我得到的输出看起来像

Account     Revenue       Expenses   Profit     PercentageProfit
XXXX        0,000       000    ,000           1
YYY         000         000    ,000           1

百分比利润计算不正确,因为它在每一行中都显示 1,我还想要另一列给我一个 运行 另一列中百分比利润的总和,例如:

Account     Revenue       Expenses   Profit     PercentageProfit  RunningTotal
XXXX        0,000       000    ,000           0.32%          0.32%
YYY         000         000    ,000           0.29%          0.61%

我工作的 SQL 服务器是 2000 版,所以我不能使用排名功能。有什么建议么。我不认为我可以使用 OVER 子句,所以我不能对利润列进行无限制的求和以获得百分比利润。

此外,一旦我们有了 运行 总计列,我可以使用像

这样的 case 语句吗
CASE WHEN RUNNINGTOTAL < 1% THEN 'TOP 1%'
CASE WHEN RUNNINGTOTAL >1% AND <20%   THEN '1-20%'
END AS 'SEGMENT'
((b.TotalRevenues -b.TotalOperatingExpenses)/sum((b.TotalRevenues -b.TotalOperatingExpenses)))

不会给你百分比,因为 TotalRevenuesTotalOperatingExpenses 都是 group by 的一部分,所以它永远不会给你总数 Profit 来计算百分比

尝试这样的事情

;WITH cte
     AS (SELECT b.HH,
                b.TotalRevenues,
                b.TotalOperatingExpenses,
                b.TotalAUA,
                ( b.TotalRevenues - b.TotalOperatingExpenses )                AS Profit,
                ( ( b.TotalRevenues - b.TotalOperatingExpenses ) / Sum(( b.TotalRevenues - b.TotalOperatingExpenses ))
                                                                     OVER() ) AS percentProfit
         FROM   (<<Inner query>>) b
         WHERE  ( b.TotalRevenues - b.TotalOperatingExpenses ) > 0)
SELECT *,
       Sum(percentProfit)OVER(ORDER BY profit desc) as RunningTotal
FROM   cte
ORDER  BY profit ASC 

如果您使用的是旧版本的 sql 服务器,请将最后的 Select 替换为

SELECT *,
       RunningTotal
FROM   cte
CROSS apply (SELECT Sum(percentProfit)
            FROM   cte b
            WHERE  b.percentProfit >= a.percentProfit) cs (RunningTotal) 
ORDER  BY profit ASC 

对于SQL SERVER 2000

SELECT *,
       (SELECT Sum(percentProfit)
        FROM   (SELECT b.HH,
                       b.TotalRevenues,
                       b.TotalOperatingExpenses,
                       b.TotalAUA,
                       ( b.TotalRevenues - b.TotalOperatingExpenses )                AS Profit,
                       ( ( b.TotalRevenues - b.TotalOperatingExpenses ) / (Select Sum(( b.TotalRevenues - b.TotalOperatingExpenses )) from (<<Inner query>>))) AS percentProfit
                FROM   (<<Inner query>>) b
                WHERE  ( b.TotalRevenues - b.TotalOperatingExpenses ) > 0) b
        WHERE  b.percentProfit >= a.percentProfit) RunningTotal
FROM   (SELECT b.HH,
               b.TotalRevenues,
               b.TotalOperatingExpenses,
               b.TotalAUA,
               ( b.TotalRevenues - b.TotalOperatingExpenses )                AS Profit,
               ( ( b.TotalRevenues - b.TotalOperatingExpenses ) / (Select Sum(( b.TotalRevenues - b.TotalOperatingExpenses )) from (<<Inner query>>))) AS percentProfit
        FROM   (<<Inner query>>) b
        WHERE  ( b.TotalRevenues - b.TotalOperatingExpenses ) > 0) a