Sql server 以水平格式显示数据
我正在使用SQLServer2008。在存储过程中,我计算了一些数量并存储在@tmp表中,然后从@tmp表中获取数据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
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) |