MS Access - преобразование значений строк в значения столбцов - PullRequest
1 голос
/ 11 марта 2020

Мне нужно преобразовать следующую таблицу с помощью MS Access:
enter image description here

в enter image description here Как мне ее преобразовать? Я новичок в MS Access 2016.

Я рассмотрел решение, предоставленное в ACCESS / SQL Объединение нескольких строк с одним столбцом в одну строку и создание нескольких столбцов . Но не смог получить желаемый результат в моем случае.

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

Вот чистое решение Access с использованием кода. Это может быть сделано более эффективно, но вы получите идею сейчас. Он создает временную таблицу Transposed, где вы найдете свой результат. Это MyTable с данными

enter image description here

, и это код для вас:

Option Compare Database
Option Explicit

Public Function Transpose() As String
    Dim ordersCnt As Integer, sql As String, i As Integer, tempTable As String, f As Variant, myTable As String
    Dim insSql As String, fieldsSql As String, updateSql As String, updateSql2 As String
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim grp As DAO.Recordset
    tempTable = "Transposed"
    myTable = "MyTable"
    ordersCnt = GetMaxOrders
    Set db = CurrentDb()
    If Not IsNull(DLookup("Name", "MSysObjects", "Name='" & tempTable & "'")) Then
        DoCmd.DeleteObject acTable, tempTable
    End If
    fieldsSql = ""
    sql = "CREATE TABLE " & tempTable & " (Project CHAR, Asset CHAR "
    For i = 1 To ordersCnt
        fieldsSql = fieldsSql & ", Order" & i & " INTEGER"
    Next i
    sql = sql & fieldsSql & ")"
    db.Execute (sql)

    insSql = "INSERT INTO " & tempTable & " (Project, Asset) VALUES ("
    Set grp = db.OpenRecordset("SELECT DISTINCT Project, Asset FROM " & myTable & " GROUP BY Project, Asset")
    grp.MoveFirst

    Do While Not grp.EOF
        sql = "'" & grp(0) & "','" & grp(1) & "')"
        db.Execute insSql & sql
        Set rs = db.OpenRecordset("SELECT * FROM " & myTable & " WHERE Project = '" & grp(0) & "' AND Asset = '" & grp(1) & "'")
        updateSql = "UPDATE " & tempTable & " SET "
        updateSql2 = ""
        i = 0
        rs.MoveFirst
        Do While Not rs.EOF
            i = i + 1
            updateSql2 = updateSql2 & "Order" & i & "= " & rs(3) & ","
            rs.MoveNext
        Loop
        updateSql = updateSql & Left(updateSql2, Len(updateSql2) - 1) & " WHERE Project = '" & grp(0) & "' AND Asset = '" & grp(1) & "'"
        db.Execute updateSql
        grp.MoveNext
    Loop
End Function

Public Function GetMaxOrders()
   Dim rst As DAO.Recordset
   Dim strSQL As String
   strSQL = "SELECT MAX(CountOfOrderNo) FROM (SELECT Count(OrderNo) AS CountOfOrderNo FROM MyTable GROUP BY Project, Asset)  "
   Set rst = CurrentDb.OpenRecordset(strSQL)
   GetMaxOrders = rst(0)
   rst.Close
   Set rst = Nothing
End Function

и результат: enter image description here

Наслаждайтесь.

0 голосов
/ 11 марта 2020

Вот скрипт sql, который работает на сервере MS SQL:

create table #T (Project varchar(50),Asset varchar(50), OrderNo int)

insert into #T (Project, Asset, OrderNo) values ('ABC','K11',3245) 
insert into #T (Project, Asset, OrderNo) values ('ABC','K11',4564) 
insert into #T (Project, Asset, OrderNo) values ('ABC','K11',5234) 
insert into #T (Project, Asset, OrderNo) values ('XYZ','M33',5346) 
insert into #T (Project, Asset, OrderNo) values ('XYZ','M33',8745) 

declare @Count int,@Cur int
declare @Qry nvarchar(4000)
set @Cur=1
select @Count=max(t.count) from (
select count(OrderNo) count from #T group by Asset)t
set @Qry=''
while @Cur<@Count+1
begin
    set @Qry= @Qry + ',(select t.OrderNo from (select ROW_NUMBER() over(order by OrderNo) ROW_NUMBER, OrderNo from #T where Asset= t1.Asset) t where ROW_NUMBER='+ cast(@Cur as varchar(10)) + ') as OrderNo' + cast(@Cur as varchar(10))
    set @Cur=@Cur+1
end
set @Qry='select distinct t1.Project, t1.Asset  ' + @Qry + ' from #T t1 ORDER BY t1.Project'
print @Qry
exec sp_executesql @Qry
drop table #T

, и это результат:

enter image description here

Я не думаю, что вы можете сделать это в MS Access.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...