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

Откуда: Москва
Сообщений: 1047
Мне нужно развернуть таблицу, но в данных есть префикс. Табличка такая:

CLIENT        ITEMOID             VALUE
-------------------------------------
500             IT.F_STATUS       lqqqq               
500             IT.SCTRY            fdfd          
600             IT.MEAL_DT         eldpfodp
600             IT.F_STATUS       lqqfd
600             IT.PK_DT0           eww          

надо чтобы итоговый селект выглядел так:
CLIENT       IT.F_STATUS        IT.SCTRY        IT.MEAL_DT       IT.PK_DT0
500            lqqqq                  fdfd                
600            lqqfd                                       eldpfodp            eww          

Пробовала делать с помощью PIVOT но ругается на префикс 'Prefixed columns are not allowed in the column list of a PIVOT operator.' Есть идея сделать с помощью глобальной временной переменной, но мне кажется это не есть хорошо.
13 авг 09, 15:41    [7534302]     Ответить | Цитировать Сообщить модератору
 Re: развернуть таблицу, если в данных есть префикс  [new]
iljy
Member

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

текст запроса, на который ругается - можете привести? Есть подозрение, что достаточно будет взять имена в квадратные скобки.
13 авг 09, 15:43    [7534330]     Ответить | Цитировать Сообщить модератору
 Re: развернуть таблицу, если в данных есть префикс  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
а у меня не ругается ни на какие префиксы
declare @t table(client int, item varchar(20), val varchar(10))
insert into @t(client, item, val)
select 500, 'IT.F_STATUS', 'lqqqq'    union all
select 500, 'IT.SCTRY',    'fdfd'     union all         
select 600, 'IT.MEAL_DT',  'eldpfodp' union all
select 600, 'IT.F_STATUS', 'lqqfd'    union all
select 600, 'IT.PK_DT0',   'eww'

select client, [IT.F_STATUS], [IT.SCTRY], [IT.MEAL_DT], [IT.PK_DT0]
  from @t
 pivot (min(val) for item in ([IT.F_STATUS], [IT.SCTRY], [IT.MEAL_DT], [IT.PK_DT0])) p

client      IT.F_STATUS IT.SCTRY   IT.MEAL_DT IT.PK_DT0
----------- ----------- ---------- ---------- ----------
500         lqqqq       fdfd       NULL       NULL
600         lqqfd       NULL       eldpfodp   eww

(2 row(s) affected)
13 авг 09, 15:49    [7534386]     Ответить | Цитировать Сообщить модератору
 Re: развернуть таблицу, если в данных есть префикс  [new]
Hel975
Member

Откуда: Москва
Сообщений: 1047
Паганель
а у меня не ругается ни на какие префиксы
declare @t table(client int, item varchar(20), val varchar(10))
insert into @t(client, item, val)
select 500, 'IT.F_STATUS', 'lqqqq'    union all
select 500, 'IT.SCTRY',    'fdfd'     union all         
select 600, 'IT.MEAL_DT',  'eldpfodp' union all
select 600, 'IT.F_STATUS', 'lqqfd'    union all
select 600, 'IT.PK_DT0',   'eww'

select client, [IT.F_STATUS], [IT.SCTRY], [IT.MEAL_DT], [IT.PK_DT0]
  from @t
 pivot (min(val) for item in ([IT.F_STATUS], [IT.SCTRY], [IT.MEAL_DT], [IT.PK_DT0])) p

client      IT.F_STATUS IT.SCTRY   IT.MEAL_DT IT.PK_DT0
----------- ----------- ---------- ---------- ----------
500         lqqqq       fdfd       NULL       NULL
600         lqqfd       NULL       eldpfodp   eww

(2 row(s) affected)


В таблице может быть много записей, а не только приведенные здесь 5, соответственно и столбцов будет n-е количество.
13 авг 09, 16:12    [7534614]     Ответить | Цитировать Сообщить модератору
 Re: развернуть таблицу, если в данных есть префикс  [new]
Konst_One
Member

Откуда:
Сообщений: 11513
и что из этого следует?

'['+convert(varchar(50),field1)+']'
13 авг 09, 16:13    [7534627]     Ответить | Цитировать Сообщить модератору
 Re: развернуть таблицу, если в данных есть префикс  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
n может быть равно 900?

Я очень хотел бы посмотреть в глаза юзера,
который собирается читать отчет с 900 столбцами
13 авг 09, 16:15    [7534643]     Ответить | Цитировать Сообщить модератору
 Re: развернуть таблицу, если в данных есть префикс  [new]
Hel975
Member

Откуда: Москва
Сообщений: 1047
2 Паганель, огромное спасибо. Сообразила, что у меня не работало. Делала так:

select client, [IT.F_STATUS], [IT.SCTRY], [IT.MEAL_DT], [IT.PK_DT0]
  from @t
 pivot (min(val) for item in ('IT.F_STATUS', 'IT.SCTRY', 'IT.MEAL_DT', 'IT.PK_DT0')) p

Не додумалась, что квадратные скобки надо еще в in ставить. Щас все заработало!
13 авг 09, 16:19    [7534678]     Ответить | Цитировать Сообщить модератору
 Re: развернуть таблицу, если в данных есть префикс  [new]
iljy
Member

Откуда:
Сообщений: 8711
Hel975

В таблице может быть много записей, а не только приведенные здесь 5, соответственно и столбцов будет n-е количество.


? вы собственно это к чему? вам нужно столбец в строку развернуть или нет? или вы хотите сказать, что вам надо динамически столбцы формировать? так это совсем другая задача, смотрите в FAQ и в поиск, тут такое обсуждалось.
13 авг 09, 16:20    [7534682]     Ответить | Цитировать Сообщить модератору
 Re: развернуть таблицу, если в данных есть префикс  [new]
Observer123
Member

Откуда: Болгария
Сообщений: 390
ест такой примерны запрос, t1, t2, t3 - разные таблицы с разное число строк. у всех, скажем поля text
идея в том, чтоб показать ети стоки в colons похоже на:

t1 | t2 | t3
table 1 - text 1 table 2 - text 1 1
table 2 - text 2 22
333


а то що ниже - показывает с пробелами. Подскажите как изправить :)
SELECT
 

   CASE [type]

        WHEN 'tablica 1' THEN [text]

        ELSE ''

      END  AS TABLICA1,

 CASE [type]

        WHEN 'tablica 2' THEN [text]

        ELSE ''

      END  AS TABLICA2,

CASE [type]

        WHEN 'tablica 3' THEN [text]

        ELSE ''

      END  AS TABLICA3

FROM    (
SELECT  
        [text], [type]
  FROM  [dbo].[t1]

union  

SELECT  
       [text], [type]
  FROM  [dbo].[t2]

union   
SELECT  
        [text], [type]
  FROM  [dbo].[t3]) a

order by TABLICA1,TABLICA2,TABLICA3 

СЕЙЧАС так:
TABLICA1 TABLICA2 TABLICA3
---------------|----------------|1
---------------|----------------|22
---------------|----------------|333
---------------|----------------|
---------------|----------------|
---------------|----------------|
| |
|Table 2 - text 1
|Table 2 - text 2
|
|
table 1 - text 1|

CREATE TABLE [dbo].[t1](
[id] [int] IDENTITY(1,1) NOT NULL,
[text] [varchar](50) NULL,
[type] [varchar](50) NULL
) ON [PRIMARY]

id text type
1 table 1 - text 1 tablica 1
2 table 1 - text 2 tablica 1
3 table 1 - text 1 tablica 1

структура t1, t2 и t3 одинакова
9 сен 09, 22:07    [7639347]     Ответить | Цитировать Сообщить модератору
 Re: развернуть таблицу, если в данных есть префикс  [new]
Observer123
Member

Откуда: Болгария
Сообщений: 390
так сейчас

К сообщению приложен файл. Размер - 0Kb
9 сен 09, 22:12    [7639356]     Ответить | Цитировать Сообщить модератору
 Re: развернуть таблицу, если в данных есть префикс  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Observer123
идея в том, чтоб показать ети стоки в colons похоже на:
t1t2t3
table 1 - text 1table 2 - text 11
table 2 - text 222
333

А почему не так:
t1t2t3
table 1 - text 1table 2 - text 2333
table 2 - text 122
1
?

Приведите, пожалуйста, алгоритм (на русском языке по шагам),
как узнать, что два значения из разных колонок должны попасть в одну и ту же строчку результата?
10 сен 09, 10:15    [7640325]     Ответить | Цитировать Сообщить модератору
 Re: развернуть таблицу, если в данных есть префикс  [new]
Observer123
Member

Откуда: Болгария
Сообщений: 390
автор
Приведите, пожалуйста, алгоритм (на русском языке по шагам),
как узнать, что два значения из разных колонок должны попасть в одну и ту же строчку результата?


короче сортировка не столь важно. Нужно чтобы были рядом верикально :)
(извините если не было очень понятно - руский язык не родной)
10 сен 09, 12:00    [7641106]     Ответить | Цитировать Сообщить модератору
 Re: развернуть таблицу, если в данных есть префикс  [new]
Maxx
Member [скрыт]

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

так вас и спрашивают по какому условию они должны оказаться рядом то?
10 сен 09, 12:06    [7641153]     Ответить | Цитировать Сообщить модератору
 Re: развернуть таблицу, если в данных есть префикс  [new]
Anddros
Member

Откуда:
Сообщений: 1077
CREATE TABLE [dbo].[t1](
[id] [int] IDENTITY(1,1) NOT NULL,
[text] [varchar](50) NULL,
[type] [varchar](50) NULL
) ON [PRIMARY]

insert t1 select 'hvhv','t1' 
union all select 'hvsadhv','t1' 
union all select 'hvsadhv11','t2' 
union all select 'hvsadhv23','t2' 
union all select 'hvsadhv3','t3' 

select rn,[t1],[t2],[t3]
from (select [text], [type], row_number()over(partition by [type] order by id) rn from t1)t
pivot (max([text]) for [type] in ([t1],[t2],[t3]))t1
10 сен 09, 12:12    [7641183]     Ответить | Цитировать Сообщить модератору
 Re: развернуть таблицу, если в данных есть префикс  [new]
Observer123
Member

Откуда: Болгария
Сообщений: 390
автор
так вас и спрашивают по какому условию они должны оказаться рядом то

ну ладно, я дал пример условный можем добавить тоже ClientID и ComputerID (- по чем их и связвать)



 
CREATE TABLE [dbo].[tblComputers](
	[ComputersID] [int] IDENTITY(1,1) NOT NULL,
	[ClientID] [int] NOT NULL,
	[ComputerID] [varchar](200) NOT NULL
) ON [PRIMARY]


CREATE TABLE [dbo].[tblIP](
	[IpID] [int] IDENTITY(1,1) NOT NULL,
	[ClientID] [int] NOT NULL,
	[ComputerID] [varchar](200) NOT NULL,
	[IP] [varchar](20) NULL
) ON [PRIMARY]

 
CREATE TABLE [dbo].[tblPrinters](
	[PrintersID] [int] IDENTITY(1,1) NOT NULL,
	[ClientID] [int] NOT NULL,
	[ComputerID] [varchar](200) NOT NULL,
	[PRINTERS] [varchar](200) NULL
) ON [PRIMARY]
 

и чтобы получилось
Компютер1 | IP1 | Printer 1
| IP2 | Printer 2
| Printer 3
10 сен 09, 12:23    [7641265]     Ответить | Цитировать Сообщить модератору
 Re: развернуть таблицу, если в данных есть префикс  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Какие у Вас между этими таблицами Foreign Keys, расскажите, пожалуйста
10 сен 09, 12:31    [7641312]     Ответить | Цитировать Сообщить модератору
 Re: развернуть таблицу, если в данных есть префикс  [new]
Observer123
Member

Откуда: Болгария
Сообщений: 390
автор
Какие у Вас между этими таблицами Foreign Keys, расскажите, пожалуйста

Foreign Keys нет - просто если стоит один и тот же ComputerID - то показать информацию вместе
(пока сервер SQL 2000, если админы позволят, будет 2005 :)
10 сен 09, 12:39    [7641371]     Ответить | Цитировать Сообщить модератору
 Re: развернуть таблицу, если в данных есть префикс  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Рекомендую автору обратиться в форум Проектирование БД с просьбой помочь привести в порядок эту модель БД
А уж потом, с готовой моделью - сюда
10 сен 09, 12:43    [7641395]     Ответить | Цитировать Сообщить модератору
 Re: развернуть таблицу, если в данных есть префикс  [new]
Observer123
Member

Откуда: Болгария
Сообщений: 390
модел БД связына импортом данных из Access mdb, структура которой изменять нельзя. Вот под ней и подстраивался.
Думаю задача решима курсором, хотелос получше, но вопрос о производителности не основной, а срок завтра:)
10 сен 09, 12:50    [7641440]     Ответить | Цитировать Сообщить модератору
 Re: развернуть таблицу, если в данных есть префикс  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Observer123
вопрос о производительности не основной
Я о производительности и не говорю
Я говорю о том, что данные так хранить нельзя
Не может быть, чтобы процесс импорта нельзя было изменить так,
чтобы заливать данные в БД, созданную на основании правильной модели

Какая модель будет правильной для Вашей задачи - Вам обязательно подскажут на другом форуме (ссылку см. выше)

А сроки Вы имхо уже сорвали :(
10 сен 09, 12:56    [7641486]     Ответить | Цитировать Сообщить модератору
 Re: развернуть таблицу, если в данных есть префикс  [new]
Observer123
Member

Откуда: Болгария
Сообщений: 390
модель данных касает приложение, которое почти сделано и по плану надо сдавать завтра.
(изменение модели БД не подходит в етом случае:)

думал исползовать временные таблицы с @@identity и потом пробежать в цикле+update - доволно неизящно, с моей точки зрения:) - но если так получится, так и будет если не сделают мне срочно 2005 сервер
10 сен 09, 13:14    [7641652]     Ответить | Цитировать Сообщить модератору
 Re: развернуть таблицу, если в данных есть префикс  [new]
Observer123
Member

Откуда: Болгария
Сообщений: 390
Anddros,

ваше решение подошло. Спасибо! :)
10 сен 09, 16:19    [7643286]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить