0

SQLServer2008 を使用しています。ストアド プロシージャでは、金額を計算して @tmp テーブルに格納し、@tmp テーブルからデータを取得します。

SELECT  t.BrokerCode,
        t.PlanYear ,
        t.PlanName ,
        SUM(Fresh) AS 'Fresh' ,
FROM    @tmp AS t
GROUP BY t.PlanYear ,
         t.PlanName ,
         t.CscName ,
         t.BrokerCode

これにより、次のような結果が得られます。

------------------------------------------------- 
 BrokerCode | PlanYear | PlanName |    Fresh    
-------------------------------------------------
    106     |    3     |   SLP    |      0.00   
    106     |    3     |   MLP    |   1140.00   
    106     |    5     |   MLP    |    570.00   
    205     |    4     |   SLP    |    450.00   

今、私はデータを次のように表示したいと思います:

----------------------------------------------------------
            |        SLP           |          MLP         |
 ---------------------------------------------------------
 BrokerCode |     3     |    4     |     3    |     5     |
 ----------------------------------------------------------
    106     |    0.00   |   0.00   |  1140.00 |  570.00   |
    205     |    0.00   | 450.00   |     0.00 |    0.00   |

ピボットクエリについて聞いたことがありますが、ピボットクエリの知識はあまりありませんが、以下のクエリを使用してみました

SELECT *
FROM
(
    SELECT [PlanYear], [BrokerCode], [Fresh] 
    FROM @tmp
) AS source
PIVOT
(
   sum([Fresh])
   FOR [PlanYear] IN ([3], [4], [5])
) as pvt

だからそれは私に結果を与える:

 ----------------------------------------------
 BrokerCode |     3     |    4     |     5    |
 ----------------------------------------------
    106     | 1140.00   |   0.00   |  570.00  |
    205     |    0.00   | 450.00   |     0.00 |

しかし、私の問題は、PlanYear が何でもかまいません。

どうすればこれを行うことができますか?ありがとう。

4

1 に答える 1

1

2 つのレベルの見出し (プラン名 > 年) があるのは表示上の問題であり、クエリの問題ではありません。ただし、次のように PIVOT で planname 列と planyear 列を結合することにより、ヘッダーを平坦化できます。この手法の検索用語は「ダイナミック ピボット」です。


SQL フィドル

create table #tmp (
  BrokerCode int,
  PlanYear int,
  PlanName char(3),
  Fresh decimal(10,4));
insert #tmp select
    106     ,    3     ,   'SLP'    ,     0.00   union all select
    106     ,    3     ,   'MLP'    ,  1140.00   union all select   
    106     ,    5     ,   'MLP'    ,   570.00   union all select
    205     ,    4     ,   'SLP'    ,   450.00;

declare @sql nvarchar(max);
select @sql = isnull(@sql+',','') +
              quotename(PlanName+'-'+right(PlanYear,10))
from (select distinct PlanName from #tmp) a
cross join (select distinct PlanYear from #tmp) b
order by PlanName, PlanYear;

set @sql = '
SELECT *
FROM
(
    SELECT PlanName+''-''+right(PlanYear,10) [PlanYear],
          [BrokerCode], [Fresh] 
    FROM #tmp
) AS source
PIVOT
(
   sum([Fresh])
   FOR [PlanYear] IN ('+@sql+')
) as pvt';

exec(@sql);

結果

| BROKERCODE |  MLP-3 |  MLP-4 |  MLP-5 |  SLP-3 |  SLP-4 |  SLP-5 |
--------------------------------------------------------------------
|        106 |   1140 | (null) |    570 |      0 | (null) | (null) |
|        205 | (null) | (null) | (null) | (null) |    450 | (null) |

質問の最後に本当に出力が必要な場合は、以下のバリエーションで十分です。

declare @sql nvarchar(max);
select @sql = isnull(@sql+',','') +
              quotename(right(PlanYear,10))
from (select distinct PlanYear from #tmp) b
order by PlanYear;

set @sql = '
SELECT *
FROM
(
    SELECT [PlanYear], [BrokerCode], [Fresh] 
    FROM #tmp
) AS source
PIVOT
(
   sum([Fresh])
   FOR [PlanYear] IN ('+@sql+')
) as pvt';

-----------------------------------------
| BROKERCODE |      3 |      4 |      5 |
-----------------------------------------
|        106 |   1140 | (null) |    570 |
|        205 | (null) |    450 | (null) |
于 2013-05-01T11:46:35.757 に答える