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)))
不会给你百分比,因为 TotalRevenues
和 TotalOperatingExpenses
都是 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
我有一个如下所示的查询:
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)))
不会给你百分比,因为 TotalRevenues
和 TotalOperatingExpenses
都是 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