powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / помогите с unpivot
32 сообщений из 32, показаны все 2 страниц
помогите с unpivot
    #35927971
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу разобратся с этой функцией. Есть вот такая таблица:

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
помогите с unpivot
    #35927991
Фотография simply
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если Вам нужен только результат сделайте это в Excel (специальная вставка-транспонировать)
???
...
Рейтинг: 0 / 0
помогите с unpivot
    #35927997
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, в ексель я знаю как это сделать :), но мне надо в sql (учусь!)
...
Рейтинг: 0 / 0
помогите с unpivot
    #35928096
Фотография simply
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
помогите с unpivot
    #35929667
Фотография qwrqwr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
помогите с unpivot
    #35930133
AlexBessonov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм, подобные вопросы на форуме появляются с завидной регулярностью. За последний месяц - как минимум один раз в неделю.

Если количество столбцов постоянно и их название не меняется, то ответ qwrqwr решит вашу проблему.
...
Рейтинг: 0 / 0
помогите с unpivot
    #35930171
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexBessonovЕсли количество столбцов постоянно и их название не меняется, то ответ qwrqwr решит вашу проблему.
При переменном количестве полей разумно делать динамический запрос: пробежаться по коллеции Fields, опрашивать название поля и вставлять очередной блок Union.
...
Рейтинг: 0 / 0
помогите с unpivot
    #35930686
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" - какая-то ошибка типов... в чем может быть проблема? Вот код, который вызывает ошибку:

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
помогите с unpivot
    #35930777
europ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
помогите с unpivot
    #35930791
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот с этого примера и разбирался, но все равно получилось только на половину:)
...
Рейтинг: 0 / 0
помогите с unpivot
    #35930804
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
помогите с unpivot
    #35930810
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
непоймучка
Спасибо за подсказку, я так в принципе и думал. Сейчас буду думать... отпишусь :)
...
Рейтинг: 0 / 0
помогите с unpivot
    #35931035
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
UNPIVOT
(val FOR chr IN (model, speed, ram, hd, cd, price))AS unpvt

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

Если количество столбцов постоянно и их название не меняется, то ответ qwrqwr решит вашу проблему.
Между прочим, я эту задачу каждый раз для себя заново решаю. Ну не так легко для понимания. Как можно значения полей сделать названиями новых полей? Нетривиально это. Руками SQL вообще боюсь трогать :)
...
Рейтинг: 0 / 0
помогите с unpivot
    #35931310
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, как вывести значение с точностью до 2х знаков ?
...
Рейтинг: 0 / 0
помогите с unpivot
    #35931323
europ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
помогите с unpivot
    #35931348
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, но я пробую в ANSI SQL, там нет VBA.
...
Рейтинг: 0 / 0
помогите с unpivot
    #35931375
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу найти как в Access преобразовывать данные ?
CAST (поле1 AS (ТИП ДАННЫХ)) - так в ANSI...
...
Рейтинг: 0 / 0
помогите с unpivot
    #35931452
Фотография qwrqwr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
помогите с unpivot
    #35931519
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело в том, что я решаю задачи на 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
помогите с unpivot
    #35931573
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все - разобрался! Вот этот работает: SELECT CAST(AVG(cast(numguns as numeric(6,2)) AS NUMERIC(6,2))) FROM classes . Хотя я все равно не пойму, почему при использовании avg(numguns) без cast при выводе программа отсекает дробную часть автоматически???
...
Рейтинг: 0 / 0
помогите с unpivot
    #35931591
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И предыдущие работает... туплю... скобки... :)
...
Рейтинг: 0 / 0
помогите с unpivot
    #35962303
DataStream
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximuS_G,

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

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

Хотя в мозгах этот unpivot все равно не отложился, не уверен, что смогу повторить без мурзилки...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
помогите с unpivot
    #39371999
Olexandr212
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
помогите с unpivot
    #39488567
alexx09
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет, нужна помощь, Помогите пожалуйста, есть таблица в таком фармате:

Name | KOD | R44 | R46 | R48 | R50 |
-------------------------------------------
F201 K23 3 3 4 4


Нужно преобразовать в следующий формат:

Name | KOD | Size | KOL |
--------------------------------
F201 K23 R44 3
F201 K23 R46 3
F201 K23 R48 4
F201 K23 R50 4

Очень прошу помогите
...
Рейтинг: 0 / 0
помогите с unpivot
    #39488684
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexx09,
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT t1.name as name,t1.kod as kod,"R44" as size, t1.R44 as kol from t1
union all
SELECT t1.name as name,t1.kod as kod, "R46", t1.R46 from t1
union all
SELECT t1.name as name,t1.kod as kod,"R48", t1.R48 from t1
UNION ALL
SELECT t1.name as name,t1.kod as kod, "R50", t1.R50 from t1;
...
Рейтинг: 0 / 0
помогите с unpivot
    #39489449
alexx09
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо. Все оказалось так просто,
...
Рейтинг: 0 / 0
помогите с unpivot
    #39489645
alexx09
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_rusimportalexx09,
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT t1.name as name,t1.kod as kod,"R44" as size, t1.R44 as kol from t1
union all
SELECT t1.name as name,t1.kod as kod, "R46", t1.R46 from t1
union all
SELECT t1.name as name,t1.kod as kod,"R48", t1.R48 from t1
UNION ALL
SELECT t1.name as name,t1.kod as kod, "R50", t1.R50 from t1;



Нужна опять помощь, чета не получается вырабатать процесс вычисления
вот что я намутил:

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT "1" AS KOD, qdfExportKroy.BDNN AS DATA, qdfExportKroy.R24 AS KOL, qdfExportKroy.Emblema AS BRAND, qdfExportKroy.Rmodel AS MODELS, qdfExportKroy.Part11 AS PARTS, qdfExportKroy.Rcode AS CODE, "24" AS RAZMER, (select sum(qdfExportKroy.R24) from qdfExportKroy where qdfExportKroy.PArt11Kroy = "1") AS NKROY, "Code 128" AS Symbology  FROM qdfExportKroy WHERE qdfExportKroy.R24 <> 0 AND qdfExportKroy.PArt11Kroy = "1"
UNION all
SELECT "1", qdfExportKroy.BDNN AS DATA, qdfExportKroy.R26, qdfExportKroy.Emblema AS BRAND, qdfExportKroy.Rmodel AS MODELS, qdfExportKroy.Part11 AS PARTS, qdfExportKroy.Rcode AS CODE, "26", (select sum(qdfExportKroy.R26) from qdfExportKroy where qdfExportKroy.PArt11Kroy = "1"), "Code 128" FROM qdfExportKroy WHERE qdfExportKroy.R26 <> 0 AND qdfExportKroy.PArt11Kroy = "1"
UNION all
SELECT "1", qdfExportKroy.BDNN AS DATA, qdfExportKroy.R28, qdfExportKroy.Emblema AS BRAND, qdfExportKroy.Rmodel AS MODELS, qdfExportKroy.Part11 AS PARTS, qdfExportKroy.Rcode AS CODE, "28", (select sum(qdfExportKroy.R28) from qdfExportKroy where qdfExportKroy.PArt11Kroy = "1"), "Code 128" FROM qdfExportKroy WHERE qdfExportKroy.R28 <> 0 AND qdfExportKroy.PArt11Kroy = "1"
UNION all
и т.д.




Нужно из общей суммы NKROY вычитать следующее значение размера R24, и в каждой строке NKROY будет уменьшаться на ту сумму которая прописана в каждой строке R24.

Например:

-R24-|-NKROY-|
------------------
--3---|----10---|
--2---|-----7---|
--4---|-----5---|
--1---|-----1---|

Вот примерно так это должно выглядеть
Помогите пожалуйста решить эту проблему, заранее благодарю.
...
Рейтинг: 0 / 0
помогите с unpivot
    #39489646
alexx09
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
или точнее так будет выглядеть формула:

-RAZMER-|-KOL-|-NKROY-|
----------------------------
-----24---|--3---|----10---|
-----24---|--2---|-----7---|
-----24---|--4---|-----5---|
-----24---|--1---|-----1---|
...
Рейтинг: 0 / 0
помогите с unpivot
    #39490083
Verbovsky Innokenty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexx09,

Лень разбираться в плохочитаемом запросе, но, возможно поможет такой подход

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT SUM(kol) AS SumKol,size
FROM
(SELECT t1.name as name,t1.kod as kod,"R44" as size, t1.R44 as kol from t1
union all
SELECT t1.name as name,t1.kod as kod, "R46", t1.R46 from t1
union all
SELECT t1.name as name,t1.kod as kod,"R48", t1.R48 from t1
UNION ALL
SELECT t1.name as name,t1.kod as kod, "R50", t1.R50 from t1) AS T
GROUP BY size
...
Рейтинг: 0 / 0
помогите с unpivot
    #39490462
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexx09или точнее так будет выглядеть формула:

-RAZMER-|-KOL-|-NKROY-|
----------------------------
-----24---|--3---|----10---|
-----24---|--2---|-----7---|
-----24---|--4---|-----5---|
-----24---|--1---|-----1---|
Решение имеет место быть только , если строки пронумерованы (см. FAQ про счетчики)
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / помогите с unpivot
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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