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

Откуда: Новосибирск
Сообщений: 683
Задача, есть страны, они импортирую, экспортируют Quantity (количество) QuantityName (единиц) товара

сделал запрос
declare @colsName nvarchar(max)
;
with YCTE
as
(select distinct QuantityName as qn from vw_CountriesUnprocessed)

SELECT @colsName = ISNULL(@colsName+',[','[') + qn +']'
from YCTE
order by qn

print @colsName

--получим года
declare @cols nvarchar(max)
;
with YCTE
as
(select distinct dbo.GetKv([Date],1) as Y from vw_CountriesUnprocessed)

SELECT @cols = ISNULL(@cols+',[','[') + Y +']'
from YCTE
order by Y

print @cols

DECLARE @sql as nvarchar(max);
SET @sql = N'
select * from 
(
select ExportCountryName, Quantity, dbo.GetKv([Date],1) as Y from vw_CountriesUnprocessed
) as Header
PIVOT (SUM(Quantity) FOR Y IN('+@cols+')) as piv
ORDER BY ExportCountryName
';


EXEC sp_executesql @sql


Вернуло табличку
CountryName 2007     2008     2009
Algeria	NULL	29051753	60760000
Austria	NULL	NULL	249810000
BELGIUM (and LUXBG -> 1998)	11031021	NULL	NULL
Bermuda	NULL	NULL	104819000
Egypt	NULL	31068005	NULL
EQUATORIAL GUINEA	NULL	616213	NULL
Indonesia	NULL	786261578	NULL
Libya	NULL	485653	NULL
LIBYAN ARAB JAMAHIRIYA (LIBYA)	NULL	3418769	NULL
Malaysia	NULL	2117894160	NULL
Nigeria	NULL	63672243	NULL
Norway	NULL	1256508	NULL
NORWAY (incl.SJ excl.1995,1996)	NULL	2464848	NULL
Oman	NULL	1263849	NULL
Qatar	NULL	535909097	1184573953
TRINIDAD	NULL	NULL	55275000
Trinidad & Tobago	NULL	3672119	NULL
TRINIDAD AND TOBAGO	NULL	349534663	NULL
Unspecified	NULL	58600000	NULL



Это уже хорошо, но теперь мне надо вывести QuantityName, за каждый год...

Тоесть должны получиться Колонки типа
CountryName 2007 2007QuantityName 2008 2008QuantityName 2009 2009QuantityName

тоесть какая страна перевозила в этом году в каких единицах, тоннах, килограммах...
QuantityName или ID есть в этой же вьюшке... не могу понять как сделать надо теперь чтобы еще добавить колонки...

или делать динамический CTE уже думаю....
16 дек 11, 13:03    [11777007]     Ответить | Цитировать Сообщить модератору
 Re: Срочно! помогите PIVOT сделать плиз!!  [new]
Khusainov_Heckfy
Member

Откуда: Новосибирск
Сообщений: 683
такая табличка в экселе...
надо в базе такой запрос замутить...

К сообщению приложен файл. Размер - 22Kb
16 дек 11, 13:07    [11777023]     Ответить | Цитировать Сообщить модератору
 Re: Срочно! помогите PIVOT сделать плиз!!  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
select ExportCountryName
      ,sum(case when Y = 2007 then Quantity end) as [2007]
      ,min(case when Y = 2007 then QuantityName end) as [2007QuantityName]
      ,sum(case when Y = 2008 then Quantity end) as [2008]
      ,min(case when Y = 2008 then QuantityName end) as [2008QuantityName]
      ,sum(case when Y = 2009 then Quantity end) as [2009]
      ,min(case when Y = 2009 then QuantityName end) as [2009QuantityName]
  from ...
 group by ExportCountryName
16 дек 11, 13:24    [11777134]     Ответить | Цитировать Сообщить модератору
 Re: Срочно! помогите PIVOT сделать плиз!!  [new]
Khusainov_Heckfy
Member

Откуда: Новосибирск
Сообщений: 683
Паганель,

спасибо, сделал уже так.....
16 дек 11, 13:31    [11777201]     Ответить | Цитировать Сообщить модератору
 Re: Срочно! помогите PIVOT сделать плиз!!  [new]
Khusainov_Heckfy
Member

Откуда: Новосибирск
Сообщений: 683
теость получился у меня запрос с курсором

DECLARE @sql as nvarchar(max);
SET @sql = N'select * from (SELECT ExportCountryName, ';


DECLARE @y nvarchar(50);

DECLARE vendor_cursor CURSOR FOR 
select*from(select distinct dbo.GetKv([Date],1) as Y from vw_CountriesUnprocessed) as q
order by Y

OPEN vendor_cursor;

FETCH NEXT FROM vendor_cursor 
INTO @y;

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT @y;
    
    set @sql = @sql + N'SUM(CASE WHEN dbo.GetKv([Date],1)='''+@y+N''' then Quantity else 0 end) as ['+@y+'], ';
    set @sql = @sql + N'QuantityName as [UnitName'+@y+'], ';
    
    FETCH NEXT FROM vendor_cursor 
	INTO @y;
END
CLOSE vendor_cursor;
DEALLOCATE vendor_cursor;

SET @sql = @sql + N' null as _x from vw_CountriesUnprocessed group by [ExportCountryName],[QuantityName]) as q'
print @sql

exec sp_executesql @sql;


вот так и работает..
но я писал, чтобы узнать может PIVOT можно сделать как то двойной.... вот)
16 дек 11, 13:32    [11777214]     Ответить | Цитировать Сообщить модератору
 Re: Срочно! помогите PIVOT сделать плиз!!  [new]
_ч_
Member

Откуда:
Сообщений: 1446
Khusainov_Heckfy,

Вам же Паганель написал как сделать без курсора
16 дек 11, 13:35    [11777232]     Ответить | Цитировать Сообщить модератору
 Re: Срочно! помогите PIVOT сделать плиз!!  [new]
Khusainov_Heckfy
Member

Откуда: Новосибирск
Сообщений: 683
_ч_,

а у меня будет за 10 лет отчет... как тогда без него?
еще есть переключение по кварталам, месяцам, тоже по несколько лет...
можно конечно циклом... чето я не догадался и мне легче курсором было написать, перепишу на цикл...
16 дек 11, 13:42    [11777278]     Ответить | Цитировать Сообщить модератору
 Re: Срочно! помогите PIVOT сделать плиз!!  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
_ч_
Вам же Паганель написал как сделать без курсора
Я написал статический запрос
А автору, я так понял, в данной задаче нужна динамика, для этого он принял решение использовать курсор
16 дек 11, 13:42    [11777279]     Ответить | Цитировать Сообщить модератору
 Re: Срочно! помогите PIVOT сделать плиз!!  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Khusainov_Heckfy
узнать может PIVOT можно сделать как то двойной
+ делать так не надо, разве что узнать...
declare @t table(c varchar(10), y int, q int, n varchar(10))
insert @t values
('UA', 2007, 12, 'kg'),
('UA', 2008, 24, 't'),
('RU', 2007, 33, 'kg'),
('RU', 2008, 55, 't')

select *
  from (select c, cast(y as varchar(30)) as y, cast(sum(q) as varchar(10)) as v from @t group by c, y
        union all
        select c, cast(y as varchar(30)) + 'Name', min(n) from @t group by c, y
        ) as t
 pivot (min(v) for y in ([2007], [2007Name], [2008], [2008Name])) as p

c          2007       2007Name   2008       2008Name
---------- ---------- ---------- ---------- ----------
RU         33         kg         55         t
UA         12         kg         24         t

(2 row(s) affected)
16 дек 11, 14:08    [11777522]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить