Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Динамический PIVOT  [new]
HOME_X
Member

Откуда:
Сообщений: 2695
Доброго дня господа !

Подскажите возможно ли применение динам. в определении полей PILOT
Table 1
EmpId	Yr	Sales
1	2005	12000.00
1	2006	18000.00
1	2007	25000.00
2	2005	15000.00
2	2006	6000.00
3	2006	20000.00
3	2007	24000.00
4	2008	10000.00
4	2009	15000.00


Результат
EmpId	2005	2006	2007	2008	2009
1      	12000.00	18000.00	25000.00	NULL	NULL
2      	15000.00	6000.00	NULL	NULL	NULL
3      	NULL	20000.00	24000.00	NULL	NULL
4      	NULL	NULL	NULL	10000.00	15000.00
ALL	27000.00	44000.00	49000.00	10000.00	15000.00


Динамический код
DECLARE @columns VARCHAR(1000)     
DECLARE @query nVARCHAR(4000)      
SELECT @columns = COALESCE(@columns +',['+cast(yr as varchar)+']','['+cast(yr as varchar)+']')        
  FROM(Select distinct yr
         From sales 
      ) x      
SET @query = 'SELECT *
                FROM (SELECT CASE WHEN GROUPING(EmpId) = 0
                                  THEN CAST (EmpId AS CHAR(7))
                                  ELSE ''ALL'' END AS EmpId,
                             CASE WHEN GROUPING(Yr) = 0
                                  THEN CAST (Yr AS CHAR(7))
                                  ELSE ''ALL'' END AS Yr,
                             SUM(Sales) AS Sales
                        FROM Sales
                       GROUP BY EmpId, Yr WITH CUBE
                     ) S
               PIVOT (SUM(Sales) FOR Yr IN ('+@columns+')) P'
EXECUTE(@query)    


Реализация не нравиться так как динамическое выполнение строки
Хотелось бы - ТИПА ТАК
SELECT *
  FROM (SELECT CASE WHEN GROUPING(EmpId) = 0
                    THEN CAST (EmpId AS CHAR(7))
                    ELSE 'ALL' END AS EmpId,
               CASE WHEN GROUPING(Yr) = 0
                    THEN CAST (Yr AS CHAR(7))
                    ELSE 'ALL' END AS Yr,
               SUM(Sales) AS Sales
          FROM Sales
         GROUP BY EmpId, Yr WITH CUBE
       ) S
 PIVOT (SUM(Sales) FOR Yr IN (select distinct [Yr] from sales)) P


Есть ли еще методы реализации
3 мар 13, 15:10    [14005391]     Ответить | Цитировать Сообщить модератору
 Re: Динамический PIVOT  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
HOME_X
Есть ли еще методы реализации
Увы...
3 мар 13, 15:29    [14005440]     Ответить | Цитировать Сообщить модератору
 Re: Динамический PIVOT  [new]
qwerty112
Guest
HOME_X
Есть ли еще методы реализации

чиста, как "вариант" :)

если "под рукой" есть "младщий брат", то так можна
+
use tempdb
go

create table t (y int, id int, val int)
go

insert into t 
select 2012, 1, 10 union all
select 2012, 1, 10 union all
select 2012, 1, 10 union all
select 2013, 1, 10 union all
select 2013, 1, 10 union all
select 2013, 2, 10
go


select *
   FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
      'C:\test.mdb';
      'admin';'',
'
TRANSFORM Sum(t.val) AS [Sum-val]
SELECT t.id
FROM [ODBC;DRIVER=SQL Server;SERVER=(local);Trusted_Connection=Yes;DATABASE=tempdb].t
GROUP BY t.id
PIVOT t.y
'
);
go

insert into t 
select 2014, 1, 10 union all
select 2014, 1, 10 union all
select 2015, 1, 10 union all
select 2016, 1, 10 union all
select 2017, 1, 10 union all
select 2018, 2, 10

go

select *
   FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
      'C:\test.mdb';
      'admin';'',
'
TRANSFORM Sum(t.val) AS [Sum-val]
SELECT t.id
FROM [ODBC;DRIVER=SQL Server;SERVER=(local);Trusted_Connection=Yes;DATABASE=tempdb].t
GROUP BY t.id
PIVOT t.y
'
);
go

drop table t

(6 row(s) affected)
id          2012                   2013
----------- ---------------------- ----------------------
1           30                     20
2           NULL                   10

(2 row(s) affected)


(6 row(s) affected)
id          2012                   2013                   2014                   2015                   2016                   2017                   2018
----------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ----------------------
1           30                     20                     20                     10                     10                     10                     NULL
2           NULL                   10                     NULL                   NULL                   NULL                   NULL                   10

(2 row(s) affected)
3 мар 13, 16:52    [14005546]     Ответить | Цитировать Сообщить модератору
 Re: Динамический PIVOT  [new]
HOME_X
Member

Откуда:
Сообщений: 2695
Принято - спасибо !

P.S. - совсем нехорошо ..
3 мар 13, 23:36    [14006390]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить