2017-05-04 159 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)'。 –