Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как развернуть таблицу (имена полей неизвестны) / 6 сообщений из 6, страница 1 из 1
04.09.2017, 15:33
    #39515160
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как развернуть таблицу (имена полей неизвестны)
Доброго дня господа !

Имею таблицу T1
F0 F1 F2 R1 100 200

Получить результат
F0 KEY VAL R1 F1 100R1 F2 200

Возможный запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select  A.F0,
          B.F1,
          iif(B.F1='F1',A.F1,iif(B.F1='F2',A.F2,Null)) F2
   from T1  A
 inner join (select 'F1' F1 from TEMP
                 union all
                 select 'F2' F1 from TEMP
               ) B
  on (1=1)



НО !!!!!!!
Проблема в том что список полей мне неизвестен (T1 это книга Excel - пользователь может менять имена полей их кол-во)
Список и названия полей я реально достать могу в виде строки 'F1','F2'...
(select 'F1' F1 from TEMP
union all
select 'F2' F1 from TEMP
) B

Но обработчик прийдется все время дописывать руками
iif(B.F1='F1',A.F1,iif(B.F1='F2',A.F2, .................................... )) F2

Есть ли еще варианты развернуть таблицу ?
Может в Microsoft Jet (использую его) есть возможность сослаться на поле таблицы через строку

Т.е. так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select  A.F0,
          B.F1,
          A.Fields(B.F1) F2
   from T1  A
 inner join (select 'F1' F1 from TEMP
                 union all
                 select 'F2' F1 from TEMP
               ) B
  on (1=1)



Заранее благодарен !
...
Рейтинг: 0 / 0
05.09.2017, 09:25
    #39515489
Как развернуть таблицу (имена полей неизвестны)
HOME_X, для начала объясните для какой цели вам нужен такой результат. И еще напоминаю, что количество секций в UNION запросе ограничено (что-то вроде 14 или 19).
...
Рейтинг: 0 / 0
05.09.2017, 09:31
    #39515493
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как развернуть таблицу (имена полей неизвестны)
HOME_XT1 это книга Excel - пользователь может менять имена полей их кол-во
Что он точно НЕ может менять? к чему можно привязаться-то?

Анатолий ( Киев )для начала объясните для какой цели вам нужен такой результат.
И почему это нужно сделать именно запросом, а не модулем.
...
Рейтинг: 0 / 0
05.09.2017, 10:10
    #39515523
Как развернуть таблицу (имена полей неизвестны)
HOME_X ,

если я правильно понял, вам нужен запрос вида
Код: sql
1.
2.
3.
select [f0],'F1' as [KEY],[f1] as [VAL] from [T1] union all 
select [f0],'F2' as [KEY],[f2] as [VAL] from [T1] union all 
select [f0],'F3' as [KEY],[f3] as [VAL] from [T1] ...


если состав полей заранее неизвестен, такой текст можно получить программно по фактическому списку полей исходной таблицы

Анатолий ( Киев )И еще напоминаю, что количество секций в UNION запросе ограничено (что-то вроде 14 или 19).сделал 50 (MSA2000), дальше - 'Слишком сложный запрос'
...
Рейтинг: 0 / 0
05.09.2017, 13:11
    #39515632
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как развернуть таблицу (имена полей неизвестны)
непоймучкасделал 50 (MSA2000), дальше - 'Слишком сложный запрос'

сделайте рабочую таблицу с полями f0,key,val
затем примерно так

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
''затем программно
dim s1,kp
s1="delete * from rab1"
currentdb.execute s1
''затем циклом по вашей таблице
kp=0
for each fld in tab1.field
kp=kp+1
if kp>1 then
s1="insert into rab1( f0,key,val)
s1=s1 & " select f0,'" & fld.name & "'," & fld.name & "  from tab1"
currentdb.execute s1
endif
next fld
...
Рейтинг: 0 / 0
05.09.2017, 13:29
    #39515650
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как развернуть таблицу (имена полей неизвестны)
подправила немного
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Option Compare Database
Option Explicit


Public Sub mm170905()
''затем программно
Dim s1, kp
Dim fld As DAO.Field
Dim dbs As DAO.Database
s1 = "delete * from rab1"
CurrentDb.Execute s1
''затем циклом по вашей таблице
kp = 0
Set dbs = CurrentDb
For Each fld In dbs.TableDefs("tab1").Fields
kp = kp + 1
Debug.Print kp, fld.Name
If kp > 1 Then
s1 = "insert into rab1( f0,key,val)"
s1 = s1 & " select f0,'" & fld.Name & "'," & fld.Name & "  from tab1"
Debug.Print " select f0,'" & fld.Name & "'," & fld.Name & "  from tab1"

CurrentDb.Execute s1
End If
Next fld
End Sub
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как развернуть таблицу (имена полей неизвестны) / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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