Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / помогите с unpivot / 25 сообщений из 32, страница 1 из 2
13.04.2009, 12:19
    #35927971
MaximuS_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
Не могу разобратся с этой функцией. Есть вот такая таблица:

code model speed ram hd cd price
12 1233 800 128 20.0 50x 970.0000

Необходимо перевернуть данные, чтобы они были вот в таком формате:

chr value
cd 50x
hd 20
model 1233
price 970.00
ram 128
speed 800

Думаю, что это делается с помощью функции UNPIVOT.
Спасибо большое за помощь, по возможности сделайте примичания!
...
Рейтинг: 0 / 0
13.04.2009, 12:23
    #35927991
simply
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
Если Вам нужен только результат сделайте это в Excel (специальная вставка-транспонировать)
???
...
Рейтинг: 0 / 0
13.04.2009, 12:25
    #35927997
MaximuS_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
Спасибо, в ексель я знаю как это сделать :), но мне надо в sql (учусь!)
...
Рейтинг: 0 / 0
13.04.2009, 12:54
    #35928096
simply
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
...
Рейтинг: 0 / 0
14.04.2009, 10:00
    #35929667
qwrqwr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
MaximuS_G
Думаю, что это делается с помощью функции UNPIVOT.

в JET нет UNPIVOT
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT "model" AS C, T1.model AS V, T1.code
FROM T1
UNION ALL
SELECT "speed", T1.speed, T1.code
FROM T1
UNION ALL
SELECT "ram", T1.ram, T1.code
FROM T1
UNION ALL
SELECT "hd", T1.hd, T1.code
FROM T1
UNION ALL
SELECT "price", T1.price, T1.code
FROM T1
ORDER BY code;
PS 'chr' и 'value' - наихудшие названия для столбцов
(одно - зарезервированное слово, другое - функция ВБА)
...
Рейтинг: 0 / 0
14.04.2009, 11:51
    #35930133
AlexBessonov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
Хм, подобные вопросы на форуме появляются с завидной регулярностью. За последний месяц - как минимум один раз в неделю.

Если количество столбцов постоянно и их название не меняется, то ответ qwrqwr решит вашу проблему.
...
Рейтинг: 0 / 0
14.04.2009, 11:58
    #35930171
mds_world
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
AlexBessonovЕсли количество столбцов постоянно и их название не меняется, то ответ qwrqwr решит вашу проблему.
При переменном количестве полей разумно делать динамический запрос: пробежаться по коллеции Fields, опрашивать название поля и вставлять очередной блок Union.
...
Рейтинг: 0 / 0
14.04.2009, 14:06
    #35930686
MaximuS_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
Спасибо большое за пример в АССESS. Подскажите, а в SQL не JET, кто-нибудь поможет ?
Вот так я сделал для одного поля:

SELECT haract, znach
FROM
(SELECT speed FROM laptop WHERE code = (SELECT max(code) FROM laptop)) as p
UNPIVOT
(znach FOR haract IN (speed)) as unpvt

НО... если я добавляю больше одного поля (speed, model, hd и т.д.), возникает следующая ошибка:
"The type of column "model" conflicts with the type of other columns specified in the UNPIVOT list" - какая-то ошибка типов... в чем может быть проблема? Вот код, который вызывает ошибку:

ELECT haract, znach
FROM
(SELECT speed, model, hd FROM laptop WHERE code = (SELECT max(code) FROM laptop)) as p
UNPIVOT
(znach FOR haract IN (speed, model, hd)) as unpvt
...
Рейтинг: 0 / 0
14.04.2009, 14:28
    #35930777
europ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
MaximuS_G,
поиск по форуму и вот один из примеров:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
--Create the table and insert values as portrayed in the above example.
CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int,
Emp3 int, Emp4 int, Emp5 int)
GO
INSERT INTO pvt VALUES ( 1 , 4 , 3 , 5 , 4 , 4 )
INSERT INTO pvt VALUES ( 2 , 4 , 1 , 5 , 5 , 5 )
INSERT INTO pvt VALUES ( 3 , 4 , 3 , 5 , 4 , 4 )
INSERT INTO pvt VALUES ( 4 , 4 , 2 , 5 , 5 , 4 )
INSERT INTO pvt VALUES ( 5 , 5 , 1 , 5 , 5 , 5 )
GO
--Unpivot the table.
SELECT VendorID, Employee, Orders
FROM 
   (SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
   FROM pvt) p
UNPIVOT
   (Orders FOR Employee IN 
      (Emp1, Emp2, Emp3, Emp4, Emp5)
)AS unpvt

Пробуйте и разбирайтесь!!!
...
Рейтинг: 0 / 0
14.04.2009, 14:35
    #35930791
MaximuS_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
Вот с этого примера и разбирался, но все равно получилось только на половину:)
...
Рейтинг: 0 / 0
14.04.2009, 14:37
    #35930804
помогите с unpivot
MaximuS_GСпасибо большое за пример в АССESS. Подскажите, а в SQL не JET, кто-нибудь поможет ?
Вот так я сделал для одного поля:

SELECT haract, znach
FROM
(SELECT speed FROM laptop WHERE code = (SELECT max(code) FROM laptop)) as p
UNPIVOT
(znach FOR haract IN (speed)) as unpvt

НО... если я добавляю больше одного поля (speed, model, hd и т.д.), возникает следующая ошибка:
"The type of column "model" conflicts with the type of other columns specified in the UNPIVOT list" - какая-то ошибка типов... в чем может быть проблема? Так пишет же проблему. Вы значения из нескольких столбцов РАЗНОГО ТИПА сливаете в один - т.е. ОДНОГО ТИПА - оно и не знает какой из предложенных входных типов сделать результирующим. Подумайте за него, попробуйте предварительно (подзапросом) поля исходной таблицы привести к единому типу (функциями конвертации типов данных вашего НЕ-JET-SQL'я)
...
Рейтинг: 0 / 0
14.04.2009, 14:40
    #35930810
MaximuS_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
непоймучка
Спасибо за подсказку, я так в принципе и думал. Сейчас буду думать... отпишусь :)
...
Рейтинг: 0 / 0
14.04.2009, 15:45
    #35931035
MaximuS_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
Решил. Вот решение, и тоже работает через union.
SELECT chr, val
FROM
(SELECT cast(model as varchar(50)) as model,
CAST(speed as varchar(50)) AS speed,
CAST(ram as varchar(50)) AS ram,
cast(hd as varchar(50)) AS hd ,
cast(cd as varchar(50)) as cd ,
cast(price as varchar(50)) AS price
FROM PC WHERE code =(select MAX(code) from PC) ) p
UNPIVOT
(val FOR chr IN (model, speed, ram, hd, cd, price))AS unpvt

Единственный вопрос, зачем для типа данных varchar указывать длинну? Он же типа variance char -то есть любая (до 255) или я ошибаюсь ?
...
Рейтинг: 0 / 0
14.04.2009, 16:34
    #35931202
CoolMind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
AlexBessonovХм, подобные вопросы на форуме появляются с завидной регулярностью. За последний месяц - как минимум один раз в неделю.

Если количество столбцов постоянно и их название не меняется, то ответ qwrqwr решит вашу проблему.
Между прочим, я эту задачу каждый раз для себя заново решаю. Ну не так легко для понимания. Как можно значения полей сделать названиями новых полей? Нетривиально это. Руками SQL вообще боюсь трогать :)
...
Рейтинг: 0 / 0
14.04.2009, 17:00
    #35931310
MaximuS_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
Подскажите, как вывести значение с точностью до 2х знаков ?
...
Рейтинг: 0 / 0
14.04.2009, 17:04
    #35931323
europ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
MaximuS_GПодскажите, как вывести значение с точностью до 2х знаков ?

Как вариант можно воспользоваться вот такой простенькой функцией:

Код: plaintext
1.
2.
3.
4.
Public Function Round(pnum As Double, pAfter As Byte) As Double
    Dim tmpCoeff As Long
    tmpCoeff =  10  ^ pAfter
    Round = CLng(pnum * tmpCoeff) / tmpCoeff
End Function
...
Рейтинг: 0 / 0
14.04.2009, 17:10
    #35931348
MaximuS_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
Спасибо, но я пробую в ANSI SQL, там нет VBA.
...
Рейтинг: 0 / 0
14.04.2009, 17:18
    #35931375
MaximuS_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
Не могу найти как в Access преобразовывать данные ?
CAST (поле1 AS (ТИП ДАННЫХ)) - так в ANSI...
...
Рейтинг: 0 / 0
14.04.2009, 17:43
    #35931452
qwrqwr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
MaximuS_Gкак в Access преобразовывать данные ?

в Access - обычно, с помощью ВБА (CInt, CDbl и т.п.)
в 'голом' JET - практически никак
(судя по справке, поддерживается подмножество скалярных функций, определенных через ODBC
и, в том числе, CONVERT),
но все это хозяйство, вроде, работает только после подключения к Джету извне через ОДБЦ (в обычном запросе не заработает точно)
Дело в том, что SQL в JET (в Access) очень-очень урезанный (например, нет даже CASE)
Обычно это компенсируется VBA-шными функциями (CASE - IIfом ; COALESCE - Nz и т.п.)
Потому что Джет работает почти всегда "бок о бок" с Access и с VBA соответственно
При попытке сделать из JETа хранилище данных - и обращаться к нему, например, через OLE DB провайдера - Вы будете очень сильно ограничены доступным синтаксисом JET-SQL

А что Вам нужно - не очень понятно: то Вам нужно в ANSI-SQL, то в Access
Вы расскажите поконкретнее...
...
Рейтинг: 0 / 0
14.04.2009, 18:04
    #35931519
MaximuS_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
Дело в том, что я решаю задачи на sql-ex.ru (ansi sql) и паралельло работаю в access (jet sql), а пользуюсь одним форумом. На данном этапе, задача стоит следующая: "... Получить результат с точностью до 2-х десятичных знаков"... я уже пробывал и так - SELECT CAST(AVG(cast(numguns as numeric(6,2)) AS NUMERIC(6,2))) FROM classes - результат ошибка, и так - SELECT CAST(avg(numguns*1.0) as numeric(3,2)) as avg FROM classes
- результат 9.00. А надо - 9.67 ... Спасибо!
...
Рейтинг: 0 / 0
14.04.2009, 18:28
    #35931573
MaximuS_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
Все - разобрался! Вот этот работает: SELECT CAST(AVG(cast(numguns as numeric(6,2)) AS NUMERIC(6,2))) FROM classes . Хотя я все равно не пойму, почему при использовании avg(numguns) без cast при выводе программа отсекает дробную часть автоматически???
...
Рейтинг: 0 / 0
14.04.2009, 18:36
    #35931591
MaximuS_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
И предыдущие работает... туплю... скобки... :)
...
Рейтинг: 0 / 0
30.04.2009, 00:37
    #35962303
DataStream
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
MaximuS_G,

SELECT CAST(AVG(numGuns*1.0) as NUMERIC(6,2)) FROM Classes
Where type = 'bb'
вот - у меня так заработало)))
...
Рейтинг: 0 / 0
29.04.2010, 23:42
    #36606363
Ethereal21
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
AlexBessonovХм, подобные вопросы на форуме появляются с завидной регулярностью. За последний месяц - как минимум один раз в неделю.

Это потому, что это упражнение с сайта онлайн обучения/сертификации sql :)
Автор не постеснялся сюда пример один в один выложить. Ну да ладно, и мне разобраться помогли, ошибка была из-за того, что MSSQL затруднялся дать имя колонке при преобразовании типов:
cast(price as varchar)
нужно было ее просто явно проименовать:
cast(price as varchar) as price

Хотя в мозгах этот unpivot все равно не отложился, не уверен, что смогу повторить без мурзилки...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
21.12.2016, 14:49
    #39371999
Olexandr212
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с unpivot
MaximuS_GРешил. Вот решение, и тоже работает через union.
SELECT chr, val
FROM
(SELECT cast(model as varchar(50)) as model,
CAST(speed as varchar(50)) AS speed,
CAST(ram as varchar(50)) AS ram,
cast(hd as varchar(50)) AS hd ,
cast(cd as varchar(50)) as cd ,
cast(price as varchar(50)) AS price
FROM PC WHERE code =(select MAX(code) from PC) ) p

Подскажите где почитать или объясните зачем в конце ставить любую букву, в Вашем случае "р" и почему при преобразовании без явного указания имя (AS speed и т.д.) запрос не будет работать?
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / помогите с unpivot / 25 сообщений из 32, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]