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

Откуда:
Сообщений: 94
Здравствуйте!
Может быть конечно это глупый вопрос но помогите!
Есть временная таблица1 из одного столбца и 36 строк! Как сделать так что бы таблица1 стала выглядеть так: одна строки и 36 столбцов! Другими словами перевернуть!
21 янв 10, 10:16    [8219567]     Ответить | Цитировать Сообщить модератору
 Re: Как перевернуть таблицу!  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Использование операторов PIVOT и UNPIVOT
21 янв 10, 10:18    [8219589]     Ответить | Цитировать Сообщить модератору
 Re: Как перевернуть таблицу!  [new]
проходил_мимо1
Guest
Ramis,
создать еще одну временную таблицу, у которой 36 столбцов и 1 строка и перекинуть данные.
Это согласно вашей указанной задаче.
21 янв 10, 10:19    [8219596]     Ответить | Цитировать Сообщить модератору
 Re: Как перевернуть таблицу!  [new]
Ramis
Member

Откуда:
Сообщений: 94
Паганель
Использование операторов PIVOT и UNPIVOT


А как использовать PIVOT если столбец один? Что то я не понял!
21 янв 10, 10:33    [8219739]     Ответить | Цитировать Сообщить модератору
 Re: Как перевернуть таблицу!  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
зависит от задачи
простейший (надеюсь) пример:
-- test data
declare @t table(dt smalldatetime)
insert into @t(dt)
select '20100110' union all
select '20100112' union all
select '20100214' union all
select '20100116' 
-- end of test data

select *
  from (select dt
              ,row_number() over(order by dt) as rn
          from @t
        ) as numbered
 pivot (min(dt) for rn in([1], [2], [3], [4])) as pvt
       
1                       2                       3                       4
----------------------- ----------------------- ----------------------- -----------------------
2010-01-10 00:00:00     2010-01-12 00:00:00     2010-01-16 00:00:00     2010-02-14 00:00:00

(1 row(s) affected)
21 янв 10, 10:40    [8219780]     Ответить | Цитировать Сообщить модератору
 Re: Как перевернуть таблицу!  [new]
Ramis
Member

Откуда:
Сообщений: 94
Паганель
зависит от задачи
простейший (надеюсь) пример:
-- test data
declare @t table(dt smalldatetime)
insert into @t(dt)
select '20100110' union all
select '20100112' union all
select '20100214' union all
select '20100116' 
-- end of test data

select *
  from (select dt
              ,row_number() over(order by dt) as rn
          from @t
        ) as numbered
 pivot (min(dt) for rn in([1], [2], [3], [4])) as pvt
       
1                       2                       3                       4
----------------------- ----------------------- ----------------------- -----------------------
2010-01-10 00:00:00     2010-01-12 00:00:00     2010-01-16 00:00:00     2010-02-14 00:00:00

(1 row(s) affected)


Конечно ни чего не понял! Но большое спасибо! буду разбираться дальше!!!
21 янв 10, 10:54    [8219940]     Ответить | Цитировать Сообщить модератору
 Re: Как перевернуть таблицу!  [new]
Ramis
Member

Откуда:
Сообщений: 94
У меня не поддерживается PIVOT! Есть ли какие нибудь другие варианты?
21 янв 10, 12:22    [8220920]     Ответить | Цитировать Сообщить модератору
 Re: Как перевернуть таблицу!  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36695
Ramis
У меня не поддерживается PIVOT! Есть ли какие нибудь другие варианты?
Чем же не поддерживается?
21 янв 10, 12:23    [8220932]     Ответить | Цитировать Сообщить модератору
 Re: Как перевернуть таблицу!  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 594
Гавриленко Сергей Алексеевич
Чем же не поддерживается?


Версию пусть покажет... :-)
21 янв 10, 12:26    [8220958]     Ответить | Цитировать Сообщить модератору
 Re: Как перевернуть таблицу!  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
-- test data
declare @t table(dt smalldatetime unique not null)
insert into @t(dt)
select '20100110' union all
select '20100112' union all
select '20100214' union all
select '20100116' 
-- end of test data
set ansi_warnings off

select min(case when rn = 1 then dt else null end) as [1]
      ,min(case when rn = 2 then dt else null end) as [2]
      ,min(case when rn = 3 then dt else null end) as [3]
      ,min(case when rn = 4 then dt else null end) as [4]
  from (select t1.dt
              ,(select count(*) from @t as t2 where t2.dt <= t1.dt) as rn
          from @t as t1
        ) as numbered
        
set ansi_warnings on

1                       2                       3                       4
----------------------- ----------------------- ----------------------- -----------------------
2010-01-10 00:00:00     2010-01-12 00:00:00     2010-01-16 00:00:00     2010-02-14 00:00:00

(1 row(s) affected)
21 янв 10, 12:26    [8220963]     Ответить | Цитировать Сообщить модератору
 Re: Как перевернуть таблицу!  [new]
Ramis
Member

Откуда:
Сообщений: 94
Гавриленко Сергей Алексеевич
Ramis
У меня не поддерживается PIVOT! Есть ли какие нибудь другие варианты?
Чем же не поддерживается?


Ну не то что не поддерживается)))
Пишет:
Incorrect syntax near 'PIVOT'. You may need to set the compatibility level of the current database to a higher value to enable this feature. See help for the stored procedure sp_dbcmptlevel.

Я делаю:
EXEC sp_dbcmptlevel #tmp, 90;
GO
Но всё равно не срабатывает!


DECLARE @FormObuch int, @SPEC int, @KURS int, @KolNaKurse int, @KolAkadem int, @AllKolNaKurse int, @AllKolAkadem int, @TypeObuch int,@TypeObuch2 int,@TO varchar(50)
CREATE TABLE #tmp(tmp1 int) DELETE FROM #tmp

SET @FormObuch=6
SET @TO='Сводная'
IF (@TO = 'Сводная') SET @TypeObuch=4 SET @TypeObuch2=11
IF (@TO = 'Договор') SET @TypeObuch=4 SET @TypeObuch2=4
IF (@TO = 'Бюджет') SET @TypeObuch=11 SET @TypeObuch2=11
SET @SPEC=1 SET @KURS=1 SET @AllKolNaKurse=0 SET @AllKolAkadem=0
WHILE @SPEC <= 6
BEGIN
WHILE @KURS <= 6
BEGIN
SELECT @KolNaKurse=count(*)FROM CRM WHERE Key_pSTATUSES_Fact=@KURS and Key_pSPECIALITY=@SPEC and Key_pFormObuch_Dim=@FormObuch and (Key_pSTATUSES=10 or Key_pSTATUSES=@KURS)
and (Key_pTypeObuch_Dim=@TypeObuch or Key_pTypeObuch_Dim=@TypeObuch2)
SELECT @KolAkadem=count(*)FROM CRM WHERE Key_pSTATUSES_Fact=@KURS and Key_pSPECIALITY=@SPEC and Key_pFormObuch_Dim=@FormObuch and Key_pSTATUSES=10
and (Key_pTypeObuch_Dim=@TypeObuch or Key_pTypeObuch_Dim=@TypeObuch2)
INSERT INTO #tmp(tmp1) VALUES (@KolNaKurse)
INSERT INTO #tmp(tmp1) VALUES (@KolAkadem)
SET @KURS = @KURS+1
SET @KolNaKurse = 0 SET @KolAkadem = 0
END
SET @SPEC = @SPEC+1
SET @KURS = 1
END

EXEC sp_dbcmptlevel #tmp, 90;
GO

SELECT * FROM (SELECT * FROM #tmp) q
PIVOT (tmp1) pvt

DROP TABLE #tmp
21 янв 10, 12:30    [8221004]     Ответить | Цитировать Сообщить модератору
 Re: Как перевернуть таблицу!  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36695
автор
Ну не то что не поддерживается)))
Пишет:
Incorrect syntax near 'PIVOT'. You may need to set the compatibility level of the current database to a higher value to enable this feature. See help for the stored procedure sp_dbcmptlevel.

Я делаю:
EXEC sp_dbcmptlevel #tmp, 90;
GO
Но всё равно не срабатывает!
А ничего, что для sp_dbcmptlevel нужно базу указывать?
21 янв 10, 12:31    [8221026]     Ответить | Цитировать Сообщить модератору
 Re: Как перевернуть таблицу!  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Ramis
SELECT * FROM (SELECT * FROM #tmp) q
PIVOT (tmp1) pvt
Статью Вы не читали
Пример мой не смотрели
Даже не знаю, чем Вам помочь
21 янв 10, 12:32    [8221031]     Ответить | Цитировать Сообщить модератору
 Re: Как перевернуть таблицу!  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
Ramis,

а Вас не смущает в имени процедуры sp_dbcmptlevel буковки db?
Почему Вы применяете её к таблице???

Лучше напишите здесь результат
PRINT @@VERSION
21 янв 10, 12:34    [8221050]     Ответить | Цитировать Сообщить модератору
 Re: Как перевернуть таблицу!  [new]
Ramis
Member

Откуда:
Сообщений: 94
Паганель
Ramis
SELECT * FROM (SELECT * FROM #tmp) q
PIVOT (tmp1) pvt
Статью Вы не читали
Пример мой не смотрели
Даже не знаю, чем Вам помочь


Статью я прочитал - не понял)) Я старался делать всё по вашему примеру!!!
21 янв 10, 12:36    [8221081]     Ответить | Цитировать Сообщить модератору
 Re: Как перевернуть таблицу!  [new]
Ramis
Member

Откуда:
Сообщений: 94
Всё PIVOT я подключил!!! Но как с ним работать я так и не понял!!
21 янв 10, 12:40    [8221124]     Ответить | Цитировать Сообщить модератору
 Re: Как перевернуть таблицу!  [new]
Ramis
Member

Откуда:
Сообщений: 94
Всё с PIVOT я разобрался! а как теперь сделать что бы он заполнял в той же последовательности?
21 янв 10, 14:01    [8222014]     Ответить | Цитировать Сообщить модератору
 Re: Как перевернуть таблицу!  [new]
Glory
Member

Откуда:
Сообщений: 104764
Ramis
Всё с PIVOT я разобрался! а как теперь сделать что бы он заполнял в той же последовательности?

Еще раз разобраться с PIVOT???
21 янв 10, 14:06    [8222073]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как перевернуть таблицу!  [new]
Если
Member

Откуда:
Сообщений: 58
День добрый.

Такой же примерно вопрос, но таблица немного другая.
Нужно сделать без pivot т.к. потом нужно будет сделать чтобы и в my sql работало тоже.

Скрины во вложении.
Примечание:
Таких code много тысяч.
У каждого из них от 1 до 20 delivery.
Причем для каждого code количество delivery=количеству cnt

Помогите пж-та.

Заранее спасибо.

К сообщению приложен файл. Размер - 28Kb
15 сен 18, 00:34    [21675313]     Ответить | Цитировать Сообщить модератору
 Re: Как перевернуть таблицу!  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30801
Если
Такой же примерно вопрос, но таблица немного другая.
Нужно сделать без pivot т.к. потом нужно будет сделать чтобы и в my sql работало тоже.
Ваша задача совсем другая, PIVOT-ом её не сделать. Варианты решений тоже есть в ФАКе (ищите агрегирование строк).
15 сен 18, 09:47    [21675389]     Ответить | Цитировать Сообщить модератору
 Re: Как перевернуть таблицу!  [new]
Если
Member

Откуда:
Сообщений: 58
Пивотом мне не нужно.

Запрос на основе вышестоящего, я написал. Но только для агрегирования delivery

select Code,min(case when rn = 1 then delivery else null end)+';'+min(case when rn = 2 then delivery else null end)
		+';'+min(case when rn = 3 then delivery else null end)+';'+min(case when rn = 4 then delivery else null end) as delivery
  from (select t1.delivery,Code
              ,(select count(delivery) from table_1 as t2 where t2.delivery <= t1.delivery ) as rn
          from table_1 as t1
        )t group by Code 



Но он неправильно работает, т.к. или здесь надо менять
when rn = 1 then delivery 
или где-то в подзапросе нужна группировка по полю Code.
И + нужно еще добавить агрегирование CNT.

В факе подобной задачи не нашел.

Заранее спасибо.
15 сен 18, 13:30    [21675484]     Ответить | Цитировать Сообщить модератору
 Re: Как перевернуть таблицу!  [new]
invm
Member

Откуда: Москва
Сообщений: 9123
Если
потом нужно будет сделать чтобы и в my sql работало тоже.
Не выйдет.

Если версия MSSQL позволяет, см. string_agg
Если нет, то
select
 a.code,
 stuff(b.x.query('delivery/text()').value('.', 'varchar(max)'), 1, 1, ''),
 stuff(b.x.query('cnt/text()').value('.', 'varchar(max)'), 1, 1, '')
from
 (select distinct code from MyTable) a cross apply
 (select ';' + delivery as delivery, ';' + cast(cnt as varchar(10)) as cnt from MyTable where code = a.code for xml path(''), type) b(x);
15 сен 18, 14:23    [21675513]     Ответить | Цитировать Сообщить модератору
 Re: Как перевернуть таблицу!  [new]
vikkiv
Member

Откуда: London
Сообщений: 2623
invm
..Если версия MSSQL позволяет, см. string_agg..
SQL_2017/AW14:
select[CountryRegionCode]
,string_agg([StateProvinceCode],',')within group(order by[StateProvinceCode])x
,string_agg(gk,',')within group(order by[StateProvinceCode])y
from(
	select[StateProvinceCode],[CountryRegionCode],max([GeographyKey])gk
	from[AdventureWorksDW2017].[dbo].[DimGeography]
	group by[StateProvinceCode],[CountryRegionCode]
	)y
group by[CountryRegionCode]
или в твоём случае:
select[code],string_agg([delivery])del,string_agg([cnt])cn
from[my_table]group by[code]
15 сен 18, 14:48    [21675531]     Ответить | Цитировать Сообщить модератору
 Re: Как перевернуть таблицу!  [new]
Если
Member

Откуда:
Сообщений: 58
Большое спасибо, работает!
Спасибо всем кто откликнулся.
15 сен 18, 15:37    [21675552]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить