Отображать данные в горизонтальном формате
Я использую 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 |
Но моя проблема в том, что PlanYear может быть чем угодно.
Так как я могу это сделать? Благодарю.
1 ответ
Наличие двух уровней заголовка (имя плана> годы) является проблемой отображения, а не вопросом запроса. Однако вы можете сгладить заголовок, объединив столбцы имени плана и плана в PIVOT следующим образом. Поисковый термин для этой техники - "динамический стержень".
SQL Fiddle
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) |