2017-05-04 158 views
1

我正在使用下面的查詢並獲取我想要的結果,我不禁想到,有可能比使用不同的where子句反覆重複該代碼更好的方法?建議?衆多工會,更簡單的方法?

WITH HHSUMMARY 
AS 
(
SELECT 
    B.HouseholdId, SUM(B.Balance) AS AUM, SUM(B.TradeRevenue + B.TrailRevenue + B.AdvisoryRevenue) AS Revenue 

    FROM 
     BookSegmentation.BookSegmentationDataset B 

    WHERE 
     B.RepName = 'Rep' 

    GROUP BY 
     B.HouseholdId 
) 

SELECT 
    '< 25K' AS [ACCT BALANCE CAT], 
    COUNT(HouseholdID) AS HH, 
    CAST(COUNT(HouseholdId) AS DECIMAL(18,2))/(SELECT CAST(COUNT(HouseholdId) AS DECIMAL(18,2)) FROM HHSUMMARY) AS [% HH], 
    SUM(AUM) AS [HH AUM], 
    SUM(AUM)/(SELECT SUM(AUM) FROM HHSUMMARY) AS [HH AUM %], 
    SUM(Revenue) AS REVENUE, 
    SUM(Revenue)/(SELECT SUM(Revenue) FROM HHSUMMARY) AS [% REV], 
    SUM(Revenue)/SUM(AUM) AS [EFFICIENCY %] 
    FROM HHSUMMARY 
    WHERE AUM < 25000 

UNION 

SELECT 
    '25K-50K' AS [ACCT BALANCE CAT], 
    COUNT(HouseholdID) AS HH, 
    CAST(COUNT(HouseholdId) AS DECIMAL(18,2))/(SELECT CAST(COUNT(HouseholdId) AS DECIMAL(18,2)) FROM HHSUMMARY) AS [% HH], 
    SUM(AUM) AS [HH AUM], 
    SUM(AUM)/(SELECT SUM(AUM) FROM HHSUMMARY) AS [HH AUM %], 
    SUM(Revenue) AS REVENUE, 
    SUM(Revenue)/(SELECT SUM(Revenue) FROM HHSUMMARY) AS [% REV], 
    SUM(Revenue)/SUM(AUM) AS [EFFICIENCY %] 
    FROM HHSUMMARY 
    WHERE AUM >= 25000 AND AUM < 50000 

UNION 

SELECT 
    '50K-100K' AS [ACCT BALANCE CAT], 
    COUNT(HouseholdID) AS HH, 
    CAST(COUNT(HouseholdId) AS DECIMAL(18,2))/(SELECT CAST(COUNT(HouseholdId) AS DECIMAL(18,2)) FROM HHSUMMARY) AS [% HH], 
    SUM(AUM) AS [HH AUM], 
    SUM(AUM)/(SELECT SUM(AUM) FROM HHSUMMARY) AS [HH AUM %], 
    SUM(Revenue) AS REVENUE, 
    SUM(Revenue)/(SELECT SUM(Revenue) FROM HHSUMMARY) AS [% REV], 
    SUM(Revenue)/SUM(AUM) AS [EFFICIENCY %] 
    FROM HHSUMMARY 
    WHERE AUM >= 50000 AND AUM < 100000 

UNION 

SELECT 
    '100K-250K' AS [ACCT BALANCE CAT], 
    COUNT(HouseholdID) AS HH, 
    CAST(COUNT(HouseholdId) AS DECIMAL(18,2))/(SELECT CAST(COUNT(HouseholdId) AS DECIMAL(18,2)) FROM HHSUMMARY) AS [% HH], 
    SUM(AUM) AS [HH AUM], 
    SUM(AUM)/(SELECT SUM(AUM) FROM HHSUMMARY) AS [HH AUM %], 
    SUM(Revenue) AS REVENUE, 
    SUM(Revenue)/(SELECT SUM(Revenue) FROM HHSUMMARY) AS [% REV], 
    SUM(Revenue)/SUM(AUM) AS [EFFICIENCY %] 
    FROM HHSUMMARY 
    WHERE AUM >= 100000 AND AUM < 250000 

UNION 

SELECT 
    '250K-500K' AS [ACCT BALANCE CAT], 
    COUNT(HouseholdID) AS HH, 
    CAST(COUNT(HouseholdId) AS DECIMAL(18,2))/(SELECT CAST(COUNT(HouseholdId) AS DECIMAL(18,2)) FROM HHSUMMARY) AS [% HH], 
    SUM(AUM) AS [HH AUM], 
    SUM(AUM)/(SELECT SUM(AUM) FROM HHSUMMARY) AS [HH AUM %], 
    SUM(Revenue) AS REVENUE, 
    SUM(Revenue)/(SELECT SUM(Revenue) FROM HHSUMMARY) AS [% REV], 
    SUM(Revenue)/SUM(AUM) AS [EFFICIENCY %] 
    FROM HHSUMMARY 
    WHERE AUM >= 250000 AND AUM < 500000 

UNION 

SELECT 
    '500K-750K' AS [ACCT BALANCE CAT], 
    COUNT(HouseholdID) AS HH, 
    CAST(COUNT(HouseholdId) AS DECIMAL(18,2))/(SELECT CAST(COUNT(HouseholdId) AS DECIMAL(18,2)) FROM HHSUMMARY) AS [% HH], 
    SUM(AUM) AS [HH AUM], 
    SUM(AUM)/(SELECT SUM(AUM) FROM HHSUMMARY) AS [HH AUM %], 
    SUM(Revenue) AS REVENUE, 
    SUM(Revenue)/(SELECT SUM(Revenue) FROM HHSUMMARY) AS [% REV], 
    SUM(Revenue)/SUM(AUM) AS [EFFICIENCY %] 
    FROM HHSUMMARY 
    WHERE AUM >= 500000 AND AUM < 750000 

UNION 

SELECT 
    '750K-1MM' AS [ACCT BALANCE CAT], 
    COUNT(HouseholdID) AS HH, 
    CAST(COUNT(HouseholdId) AS DECIMAL(18,2))/(SELECT CAST(COUNT(HouseholdId) AS DECIMAL(18,2)) FROM HHSUMMARY) AS [% HH], 
    SUM(AUM) AS [HH AUM], 
    SUM(AUM)/(SELECT SUM(AUM) FROM HHSUMMARY) AS [HH AUM %], 
    SUM(Revenue) AS REVENUE, 
    SUM(Revenue)/(SELECT SUM(Revenue) FROM HHSUMMARY) AS [% REV], 
    SUM(Revenue)/SUM(AUM) AS [EFFICIENCY %] 
    FROM HHSUMMARY 
    WHERE AUM >= 750000 AND AUM < 1000000 

UNION 

SELECT 
    '1MM-5MM' AS [ACCT BALANCE CAT], 
    COUNT(HouseholdID) AS HH, 
    CAST(COUNT(HouseholdId) AS DECIMAL(18,2))/(SELECT CAST(COUNT(HouseholdId) AS DECIMAL(18,2)) FROM HHSUMMARY) AS [% HH], 
    SUM(AUM) AS [HH AUM], 
    SUM(AUM)/(SELECT SUM(AUM) FROM HHSUMMARY) AS [HH AUM %], 
    SUM(Revenue) AS REVENUE, 
    SUM(Revenue)/(SELECT SUM(Revenue) FROM HHSUMMARY) AS [% REV], 
    SUM(Revenue)/SUM(AUM) AS [EFFICIENCY %] 
    FROM HHSUMMARY 
    WHERE AUM >= 1000000 AND AUM < 5000000 

UNION 

SELECT 
    '> 5MM' AS [ACCT BALANCE CAT], 
    COUNT(HouseholdID) AS HH, 
    CAST(COUNT(HouseholdId) AS DECIMAL(18,2))/(SELECT CAST(COUNT(HouseholdId) AS DECIMAL(18,2)) FROM HHSUMMARY) AS [% HH], 
    SUM(AUM) AS [HH AUM], 
    SUM(AUM)/(SELECT SUM(AUM) FROM HHSUMMARY) AS [HH AUM %], 
    SUM(Revenue) AS REVENUE, 
    SUM(Revenue)/(SELECT SUM(Revenue) FROM HHSUMMARY) AS [% REV], 
    SUM(Revenue)/SUM(AUM) AS [EFFICIENCY %] 
    FROM HHSUMMARY 
    WHERE AUM >= 5000000 

UNION 

SELECT 
    'TOTAL' AS [ACCT BALANCE CAT], 
    COUNT(HouseholdID) AS HH, 
    CAST(COUNT(HouseholdId) AS DECIMAL(18,2))/(SELECT CAST(COUNT(HouseholdId) AS DECIMAL(18,2)) FROM HHSUMMARY) AS [% HH], 
    SUM(AUM) AS [HH AUM], 
    SUM(AUM)/(SELECT SUM(AUM) FROM HHSUMMARY) AS [HH AUM %], 
    SUM(Revenue) AS REVENUE, 
    SUM(Revenue)/(SELECT SUM(Revenue) FROM HHSUMMARY) AS [% REV], 
    SUM(Revenue)/SUM(AUM) AS [EFFICIENCY %] 
    FROM HHSUMMARY 

這裏是我的結果:

enter image description here

+3

您需要對案例表達式進行「GROUP BY」處理,並且可以使用分組集合或彙總完成總計。 –

回答

6

是的,有一個更好的辦法。您可以在CTE定義組,然後用組GROUP BY

WITH HHSUMMARY AS (
     SELECT B.HouseholdId, SUM(B.Balance) AS AUM, 
      SUM(B.TradeRevenue + B.TrailRevenue + B.AdvisoryRevenue) AS Revenue, 
      (CASE WHEN SUM(B.BALANCE) < 25000 THEN '<25000' 
        WHEN SUM(B.BALANCE) < 50000 THEN '25K-50K' 
        . . . 
       END) as [ACCT BALANCE CAT] 
     FROM BookSegmentation.BookSegmentationDataset B 
     WHERE B.RepName = 'Rep' 
     GROUP BY B.HouseholdId 
    ) 
SELECT COALESCE([ACCT BALANCE CAT], 'Total'), 
     COUNT(HouseholdID) AS HH, 
     CAST(COUNT(HouseholdId) AS DECIMAL(18,2))/(SELECT CAST(COUNT(HouseholdId) AS DECIMAL(18,2)) FROM HHSUMMARY) AS [% HH], 
     SUM(AUM) AS [HH AUM], 
     SUM(AUM)/(SELECT SUM(AUM) FROM HHSUMMARY) AS [HH AUM %], 
     SUM(Revenue) AS REVENUE, 
     SUM(Revenue)/(SELECT SUM(Revenue) FROM HHSUMMARY) AS [% REV], 
     SUM(Revenue)/SUM(AUM) AS [EFFICIENCY %] 
FROM HHSUMMARY 
GROUP BY GROUPING SETS (([ACCT BALANCE CAT]),()); 

注意使用GROUPING SETS計算總。您也可以使用ROLLUP

+0

用作除數的三個子查詢確實應該被拉出(單個)第二個CTE。 –

+0

感謝您的時間戈登,這正是我需要的,雖然我需要正確地訂購它,低貓到高貓,總數在底部。我試着把'N. '在我的帳戶餘額帳戶值和總數最高的可能數字前面,但我真的不希望在我的輸出中顯示數字。另外,如果一個存儲桶不包含一行,該數字將被跳過,並且看起來很有趣。 – Gavin

+0

@Gavin。 。 。嘗試添加'ORDER BY MIN(AUM)'。 –