Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Транспонировать табицу / 15 сообщений из 15, страница 1 из 1
04.11.2017, 21:20
    #39547841
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать табицу
ыЫ..

Часто встаёт необходимость собрать значения полей только для одной записи, и вывести их в столбце
В Excel есть такая фича: называется "Транспонировать".
А каким таким мудрёным запросом это можно сделать в Access?
...
Рейтинг: 0 / 0
04.11.2017, 21:50
    #39547855
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать табицу
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT "ст1", ст1 FROM Tabl WHERE ......
UNION ALL
SELECT "ст2", ст2 FROM Tabl WHERE ...... 
UNION ALL
.....................................
.....................................
SELECT "ст13", ст13 FROM Tabl WHERE ...... 
...
Рейтинг: 0 / 0
04.11.2017, 22:15
    #39547867
Вакшуль Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать табицу
Настаев и вывести их в столбце
что значит в столбце?
...
Рейтинг: 0 / 0
04.11.2017, 22:16
    #39547869
Вакшуль Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать табицу
я имею ввиду, куда потом этот "столбец" вы хотите прикрутить?
Массив это тоже своего рода столбец
...
Рейтинг: 0 / 0
04.11.2017, 22:35
    #39547872
Вакшуль Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать табицу
Настаеви вывести их в столбце
может вы имеете ввиду, что в форме, имеющей источник данных, расположить поля вывод не в ряд, а одно под одним?
...
Рейтинг: 0 / 0
04.11.2017, 22:44
    #39547875
Вакшуль Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать табицу
вот так?
...
Рейтинг: 0 / 0
04.11.2017, 23:10
    #39547880
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать табицу
__Michelle
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT "ст1", ст1 FROM Tabl WHERE ......
UNION ALL
SELECT "ст2", ст2 FROM Tabl WHERE ...... 
UNION ALL
.....................................
.....................................
SELECT "ст13", ст13 FROM Tabl WHERE ...... 



Спасибо за пример. Только что означает ALL?
...
Рейтинг: 0 / 0
04.11.2017, 23:18
    #39547886
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать табицу
Если ALL отсутствует, то выведутся только уникальные записи (без повторений в наборах),
а с ALL - абсолютно все.
С ALL работает быстрее, так как не проверяет на дубли.
Но у Вас дублей нет заведомо, поэтому проверки не нужны.
...
Рейтинг: 0 / 0
04.11.2017, 23:54
    #39547900
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать табицу
__Michelle, спасибо

Воспользовавшись советом, "сматерил" себе функцию (может, кому пригодится)
Можно транспонировать любую таблицу с одной записью
Меня спрашивали, зачем мне это надо..

У меня есть таблица с множеством полей, каждое из которых вычисляется на основании предыдущего. Похоже на то, как в Excel некоторые делают. И мне понадобилось видеть все этапы вычислений в удобном виде. То бишь в столбце.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Public Function транспонирование(ByRef источник As String, ByRef ключевое_поле As String, ByRef код As Long, Optional ByRef все_записи As Boolean) As String

    Dim rst As Recordset
    Dim fld As Field
    Dim i As Byte
    Dim приставка As String
    
    Set rst = CurrentDb.OpenRecordset("SELECT * FROM [" & источник & "] WHERE [" & ключевое_поле & "]=" & код)
    
    приставка = " UNION"
    If все_записи Then приставка = приставка & " ALL"
    
    For Each fld In rst.Fields
    
        транспонирование = транспонирование & приставка & " SELECT '" & fld.Name & "' AS поле, '" & CStr(fld.Value) & "' AS значение From " & источник
        i = i + 1
        
    Next fld
    
    транспонирование = Mid(транспонирование, Len(приставка) + 2)
    
End Function
...
Рейтинг: 0 / 0
04.11.2017, 23:55
    #39547901
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать табицу
Вакшуль Сергейя имею ввиду, куда потом этот "столбец" вы хотите прикрутить?
Массив это тоже своего рода столбец

Я бы записал в массив, но мне нужно было вывести эти данные в форму
...
Рейтинг: 0 / 0
05.11.2017, 00:02
    #39547902
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать табицу
чуток не дописал
Я там счётчик поставил, чтобы результат можно было сортировать по желанию
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Public Function транспонирование(ByRef таблица As String, ByRef ключевое_поле As String, ByRef код As Long, Optional ByRef все_записи As Boolean) As String

    Dim rst As Recordset
    Dim fld As Field
    Dim i As Byte
    Dim приставка As String
    
    Set rst = CurrentDb.OpenRecordset("SELECT * FROM [" & таблица & "] WHERE [" & ключевое_поле & "]=" & код)
    
    приставка = " UNION"
    If все_записи Then приставка = приставка & " ALL"
    
    For Each fld In rst.Fields
    
        транспонирование = транспонирование & приставка & " SELECT " & i & " AS код, '" & fld.Name & "' AS поле, '" & CStr(fld.Value) & "' AS значение From " & таблица
        i = i + 1
        
    Next fld
    
    транспонирование = Mid(транспонирование, Len(приставка) + 2)
    
End Function
...
Рейтинг: 0 / 0
05.11.2017, 00:37
    #39547916
Вакшуль Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать табицу
НастаевМеня спрашивали, зачем мне это надо..

У меня есть таблица с множеством полей, каждое из которых вычисляется на основании предыдущего. Похоже на то, как в Excel некоторые делают. И мне понадобилось видеть все этапы вычислений в удобном виде. То бишь в столбце.Так чем плохо расположить поля одно под другим? 20927826 . Это просто форма источник данных которой:
Код: sql
1.
SELECT t1.id, t1.ст1, t1.ст2, t1.ст3, t1.ст4, t1.ст5 FROM t1;


Или цель была именно в этом:
НастаевА каким таким мудрёным запросом это можно сделать в Access?
...
Рейтинг: 0 / 0
05.11.2017, 02:06
    #39547927
Вакшуль Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать табицу
НастаевА каким таким мудрёным запросом это можно сделать в Access?
ну, мудреным, так мудреным.
Вот вам еще вариант. Набор записей редактируемый. Без использования дополнительных таблиц.
Файл во вложении.

Код: 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.
Option Compare Database
Option Explicit

Private Sub Form_Open(Cancel As Integer)
Dim rstFrom As New ADODB.Recordset
Dim rstTo As New ADODB.Recordset
Dim i As Long

    rstFrom.Open "select * from t1 where id = 1", CurrentProject.Connection, adOpenKeyset
    With rstTo.Fields
        .Append "id", adInteger
        .Append "fieldName", adVarWChar, 255
        .Append "fieldValue", adVarWChar, 255
    End With
    
    With rstTo
        .Open
        For i = 1 To rstFrom.Fields.Count
            .AddNew Array("id", "fieldName", "fieldValue"), Array(i, rstFrom.Fields(i - 1).Name, rstFrom.Fields(i - 1).Value)
        Next
        .UpdateBatch
    End With
    
    Set Me.Recordset = rstTo
End Sub



Нравится слово "Транспонировать" - посмотрите справку по методу GetRows адошного рекодсета:
https://msdn.microsoft.com/en-us/library/ee266344(v=bts.10).aspx?f=255&MSPPError=-2147217396
...
Рейтинг: 0 / 0
07.11.2017, 16:06
    #39549073
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать табицу
Вакшуль Сергей, спасибо за мудрёный вариант. Мне нравится
...
Рейтинг: 0 / 0
08.11.2017, 21:58
    #39549914
westtt77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транспонировать табицу
Вакшуль СергейНастаевА каким таким мудрёным запросом это можно сделать в Access?
ну, мудреным, так мудреным.
Вот вам еще вариант. Набор записей редактируемый. Без использования дополнительных таблиц.
Файл во вложении.

Код: 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.
Option Compare Database
Option Explicit

Private Sub Form_Open(Cancel As Integer)
Dim rstFrom As New ADODB.Recordset
Dim rstTo As New ADODB.Recordset
Dim i As Long

    rstFrom.Open "select * from t1 where id = 1", CurrentProject.Connection, adOpenKeyset
    With rstTo.Fields
        .Append "id", adInteger
        .Append "fieldName", adVarWChar, 255
        .Append "fieldValue", adVarWChar, 255
    End With
    
    With rstTo
        .Open
        For i = 1 To rstFrom.Fields.Count
            .AddNew Array("id", "fieldName", "fieldValue"), Array(i, rstFrom.Fields(i - 1).Name, rstFrom.Fields(i - 1).Value)
        Next
        .UpdateBatch
    End With
    
    Set Me.Recordset = rstTo
End Sub



Нравится слово "Транспонировать" - посмотрите справку по методу GetRows адошного рекодсета:
https://msdn.microsoft.com/en-us/library/ee266344(v=bts.10).aspx?f=255&MSPPError=-2147217396

Что-то напоминает мне это поездку из Харькова в Киев через Владивосток
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Транспонировать табицу / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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