2017-01-20 17 views
0

I는 다음과 같습니다 쿼리가 있습니다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 

내가 percaentage 이익은 계산되지 않는

Account  Revenue  Expenses Profit  PercentageProfit 
XXXX  $100,000  $20000 $15,000   1 
YYY   $90000   $20000 $14,000   1 

과 같은 출력을 얻을 수를 모든 열에서 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 버전이므로 순위 기능을 사용할 수 없습니다. 어떤 제안. 나는 내가 이익을 얻으려고 이익이되는 칼럼에 무제한의 액수를 할 수 없도록 나는 절을 사용할 수 있다고 생각하지 않는다. 우리가 실행중인 총 열이 나면 또한

, 내가

CASE WHEN RUNNINGTOTAL < 1% THEN 'TOP 1%' 
CASE WHEN RUNNINGTOTAL >1% AND <20% THEN '1-20%' 
END AS 'SEGMENT' 
같은 경우 문을 사용할 수 있습니다

답변

0
모두 TotalRevenuesTotalOperatingExpensesgroup by의 일부는 그래서 당신이 총주지 않을 것이다했기 때문에

당신 비율을 제공하지 않습니다

((b.TotalRevenues -b.TotalOperatingExpenses)/sum((b.TotalRevenues -b.TotalOperatingExpenses))) 
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 Server 2005에서 도입 된 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

CTE를 들어

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

으로 최종 Select을 대체 SQL 서버의 이전 버전을 사용하는 경우이 문제는 SQL Server 2000의 – SqlZim

+0

을에 @ SqlZim - 업데이트되었습니다. 아직 '2000'에 대한 쿼리가 확실하지 않습니다. \ 2 년 뒤 경력을 시작했습니다. D –

+0

예, 2000 년에 까다로워졌습니다. 그 밖의 다른 방법은 확실하지 않습니다. 당신이 올린 내용. Over()는 2008 년에 소개되었지만 업데이트에서 잘라내 기/붙여 넣기 오류라고 생각합니다. – SqlZim