Sql server 以水平格式显示数据

Sql server 以水平格式显示数据,sql-server,sql-server-2008,pivot,dynamic-pivot,Sql Server,Sql Server 2008,Pivot,Dynamic Pivot,我正在使用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.B

我正在使用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   |
我听说过Pivot查询,但我对Pivot查询了解不多,但我还是尝试使用下面的查询

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 |
但我的问题是,计划年可以是任何事情


那我怎么做呢?。谢谢。

有两级标题(计划名称>年份)是一个显示问题,而不是查询问题。但是,您可以通过合并透视中的planname和planyear列来展平标题,如下所示。这种技术的搜索词是“动态轴心”


结果

| 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) |
如果你真的想在你的问题结束时得到结果,那么我会的

| 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) |