2017-01-20 2 views
0

У меня есть запрос, который выглядит следующим образом:SQL Выполнение полного или сазе на нарастающую сумму

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  $100,000  $20000 $15,000   1 
YYY   $90000   $20000 $14,000   1 

Прибыль percaentage не рассчитывается так как он показывает 1 в каждой строке, а также я хочу другой столбец, который дает мне текущую общую процентную прибыль в другом столбце, например:

Account  Revenue  Expenses Profit  PercentageProfit RunningTotal 
XXXX  $100,000  $20000 $15,000   0.32%   0.32% 
YYY   $90000   $20000 $14,000   0.29%   0.61% 

SQL-сервер, над которым я работаю, - это версия 2000, поэтому я не могу использовать функции рангов. Какие-либо предложения. Я не думаю, что могу использовать предложения OVER, поэтому я не могу сделать неограниченную сумму в столбце прибыли, чтобы получить процентную прибыль.

Кроме того, когда мы имеем бегущую общий столбец может я использовать тематические заявления, как

CASE WHEN RUNNINGTOTAL < 1% THEN 'TOP 1%' 
CASE WHEN RUNNINGTOTAL >1% AND <20% THEN '1-20%' 
END AS 'SEGMENT' 

ответ

0
((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 
+0

КТР были введены в SQL Server 2005, вопрос находится на SQL Server 2000 – SqlZim

+0

@ SqlZim - Обновлено .. Все еще не уверен, что запрос будет работать на '2000': \ Я начал свою карьеру 2 года назад: D –

+0

Ya, это становится сложно в 2000 году. Я не уверен, как иначе я буду делать это иначе, чем что вы опубликовали. Over() была введена в 2008 году, но я думаю, что это ошибка вырезания/вставки в обновлении. – SqlZim

Смежные вопросы