powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Транспонировать табицу
15 сообщений из 15, страница 1 из 1
Транспонировать табицу
    #39547841
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ыЫ..

Часто встаёт необходимость собрать значения полей только для одной записи, и вывести их в столбце
В Excel есть такая фича: называется "Транспонировать".
А каким таким мудрёным запросом это можно сделать в Access?
...
Рейтинг: 0 / 0
Транспонировать табицу
    #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
Транспонировать табицу
    #39547867
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Настаев и вывести их в столбце
что значит в столбце?
...
Рейтинг: 0 / 0
Транспонировать табицу
    #39547869
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я имею ввиду, куда потом этот "столбец" вы хотите прикрутить?
Массив это тоже своего рода столбец
...
Рейтинг: 0 / 0
Транспонировать табицу
    #39547872
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Настаеви вывести их в столбце
может вы имеете ввиду, что в форме, имеющей источник данных, расположить поля вывод не в ряд, а одно под одним?
...
Рейтинг: 0 / 0
Транспонировать табицу
    #39547875
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот так?
...
Рейтинг: 0 / 0
Транспонировать табицу
    #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
Транспонировать табицу
    #39547886
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если ALL отсутствует, то выведутся только уникальные записи (без повторений в наборах),
а с ALL - абсолютно все.
С ALL работает быстрее, так как не проверяет на дубли.
Но у Вас дублей нет заведомо, поэтому проверки не нужны.
...
Рейтинг: 0 / 0
Транспонировать табицу
    #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
Транспонировать табицу
    #39547901
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль Сергейя имею ввиду, куда потом этот "столбец" вы хотите прикрутить?
Массив это тоже своего рода столбец

Я бы записал в массив, но мне нужно было вывести эти данные в форму
...
Рейтинг: 0 / 0
Транспонировать табицу
    #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
Транспонировать табицу
    #39547916
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НастаевМеня спрашивали, зачем мне это надо..

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


Или цель была именно в этом:
НастаевА каким таким мудрёным запросом это можно сделать в Access?
...
Рейтинг: 0 / 0
Транспонировать табицу
    #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
Транспонировать табицу
    #39549073
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль Сергей, спасибо за мудрёный вариант. Мне нравится
...
Рейтинг: 0 / 0
Транспонировать табицу
    #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
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Транспонировать табицу
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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