Sql 将事务分组到一行上

Sql 将事务分组到一行上,sql,excel,vba,Sql,Excel,Vba,假设我有以下包含事务数据的数据集。以下子集用于说明: BillName Item Number Customer A 477565 Customer A 8400212 Customer A 8400213 Customer A 461230 Customer A 461240 Customer A 477545 Customer A 8657915 Customer B 672050 Customer B 892223 Customer C 640741 Custom

假设我有以下包含事务数据的数据集。以下子集用于说明:

BillName    Item Number
Customer A  477565
Customer A  8400212
Customer A  8400213
Customer A  461230
Customer A  461240
Customer A  477545
Customer A  8657915
Customer B  672050
Customer B  892223
Customer C  640741
Customer C  640772
Customer C  640660
如何使用Excel或SQL Server将其转换为如下所示

Customer A  477565  8400212 8400213 461230  461240  477545  8657915
Customer B  672050  892223                  
Customer C  640741  640772  640660  

在excel中,添加另一行以显示条目的顺序并创建透视表:

BillName组项目编号优先级

BillName    group   Item Number precedence
Customer    A   477565  1
Customer    A   8400212 2
Customer    A   8400213 3
Customer    A   461230  4
Customer    A   461240  5
Customer    A   477545  6
Customer    A   8657915 7
Customer    B   672050  1
Customer    B   892223  2
Customer    C   640741  1
Customer    C   640772  2
Customer    C   640660  3
创建如下所示的透视表:

或以表格形式重复所有标签


编辑:对于SQL,请查看Pivot关系运算符以执行此类操作

我认为@ivan7707的解决方案是可行的。它利用了Excel的强大功能,您甚至可以通过MS Query将数据集引入

也就是说,如果您正在寻找蛮力解决方案,您可以在VBA中使用类似的方法:

Dim Conn As New ADODB.Connection
Dim cmd As ADODB.Command
Dim rs As ADODB.Recordset
Dim bill, item, priorBill As String
Dim row, col As Integer
Dim ws As Worksheet

Set ws = ActiveWorkbook.ActiveSheet

Conn.Open "Your Connection String"
Set rs = Conn.Execute("select bill_name, item_number from bills order by 1")

row = 1
col = 2

Do While Not rs.EOF
  bill = rs.Fields(0).Value
  item = rs.Fields(1).Value

  If bill <> priorBill Then
    row = row + 1
    col = 2

    ws.Cells(row, 1).Value = bill
    priorBill = bill
  End If

  ws.Cells(row, col).Value = item
  col = col + 1

  rs.MoveNext
Loop

Conn.Close
Dim Conn作为新ADODB.连接
Dim cmd作为ADODB.Command
将rs设置为ADODB.Recordset
暗票据、项目、优先票据作为字符串
Dim行,列为整数
将ws设置为工作表
设置ws=ActiveWorkbook.ActiveSheet
连接。打开“您的连接字符串”
设置rs=Conn.Execute(“按1从票据订单中选择票据名称、项目编号”)
行=1
col=2
做而不做
账单=卢比字段(0).值
项目=rs.字段(1).值
如果比尔优先
行=行+1
col=2
ws.Cells(第1行)。值=账单
priorBill=比尔
如果结束
ws.Cells(行,列).Value=item
col=col+1
下一个
环
康涅狄格州关闭
结果:


什么数据库管理系统?MS SQL Server?这是个好主意,但数据集太大。我将在MS SQL中试一试Server@user1765523你没有在问题中说明这一点。如果这不是一个选项,为什么要在excel中使用它?我根据您的问题回答:“如何使用Excel将其转换为如下所示…”数据集在Excel中,运行良好。我不知道最大组合是什么,我知道使用透视表方法会达到列的极限。