2

国ごとにパーセンテージを分割するクエリを実行しています..次のようなものです:

 select country_of_risk_name, (sum(isnull(fund_weight,0)*100)) as 'FUND WEIGHT' from       OFI_Country_Details
WHERE FIXED_COMP_FUND_CODE = 'X'
GROUP BY country_of_risk_name

これは正しい出力を返します。これは、1 か国から 100 か国の範囲で指定できます。パーセンテージの上位 5 件を表示し、上位 5 件以外のすべてのパーセンテージを「その他」カテゴリにグループ化するロジックを作成するにはどうすればよいですか? 出力例:

  1. アメリカ - 50%
  2. カナダ - 10%
  3. フランス - 4%
  4. スペイン - 2%
  5. イタリア - 1.7%
  6. その他 - 25%
4

4 に答える 4

2
SELECT rn, CASE WHEN rn <= 5 THEN x.country_of_risk_name
                ELSE 'Other' END AS country_of_risk_name, 
           SUM(x.[FUND WEIGHT]) AS SumPerc
FROM(      
     SELECT country_of_risk_name,
            CASE WHEN ROW_NUMBER() OVER(ORDER BY SUM(ISNULL(fund_weight,0)*100) DESC) <= 5
                 THEN ROW_NUMBER() OVER(ORDER BY SUM(ISNULL(fund_weight,0)*100) DESC)
                 ELSE 6 END AS rn,
            SUM(ISNULL(fund_weight,0)*100) AS [FUND WEIGHT]
     FROM country_of_risk_name
     WHERE FIXED_COMP_FUND_CODE = 'X'
     GROUP BY country_of_risk_name
     ) x
GROUP BY rn, CASE WHEN rn <= 5 THEN x.country_of_risk_name
                  ELSE 'Other' END 
ORDER BY x.rn

デモを見るSQLFiddle

于 2013-06-28T06:01:12.813 に答える
0

これを試して。

    declare  @country_of_risk_name as table (country varchar(100),
                              FUND decimal(10,2));

    insert into @country_of_risk_name values
      ('USA', 50),
      ('Canada', 10),
      ('France', 4),
      ('Spain', 2),
      ('Italy', 1.7),
      ('Other1', 1.5),
      ('Other2', 1.5),
      ('Other3', 1.5),
      ('Other4', 1.5),
      ('Other5', 1.5),
      ('Other6', 1.5);



    DECLARE @TBL AS TABLE(country_of_risk_name VARCHAR(100), FUND DECIMAL(18,2))

    INSERT INTO @TBL
    SELECT TOP 5 country,SUM(FUND) FROM @country_of_risk_name
      group by country
      ORDER BY SUM(FUND) desc
      select * from @TBL
      UNION ALL 
      select 'other', SUM(tbl1.fund) 
      from @country_of_risk_name tbl1 
      left join @TBL tbl2 on tbl1.country =tbl2.country_of_risk_name 
      where 
          tbl2.country_of_risk_name  is null 
于 2013-06-28T03:33:08.763 に答える
0

CTEを使用したクエリは次のとおりです。また、実用的なソリューションの例

;with TotalPercent(Country_Of_Risk_Name, Fund_Weight)
as(
    select Country_Of_Risk_Name, sum(isnull(Fund_Weight, 0) * 100) Fund_Weight
    from OFI_Country_Details
    where
       FIXED_COMP_FUND_CODE = 'X'
    group by Country_Of_Risk_Name
  ),
  PercentWithRank(Country_Of_Risk_Name, Fund_Weight, RowNumber)
  as (
      select Country_Of_Risk_Name, Fund_Weight, row_number() over (order by Fund_Weight desc) RowNumber
      from TotalPercent
  )
  select Country_Of_Risk_Name, Fund_Weight
  from PercentWithRank
  where
      RowNumber <= 5
  union all
  select 'Other', sum(Fund_Weight) Fund_Weight
  from PercentWithRank
  where
      RowNumber > 5
于 2013-06-28T03:39:32.237 に答える