4

我已经尝试在 Stackoverflow 和 Google 上搜索这个问题的答案,但还没有找到。我认为我的部分问题是我不确定我正在尝试做的关键字是什么。

我的数据看起来像这样:

ID    Var1    Var2    Name
01    0001    0002    Bill
01    0001    0002    Jim
01    0001    0002    Sally
02    0003    0004    Sam
02    0003    0004    Kyle

您会看到我有多行具有相同的 ID 以及相同的 Var1 和 Var2,但每一行都有一个唯一的名称。我想“展平”这些行,因此每个 ID 只有一行,并且每行都有尽可能多的“名称”列,以适应所有数据。

像这样:

ID    Var1    Var2    Name1    Name2    Name3
01    0001    0002    Bill     Jim      Sally
02    0003    0004    Sam      Kyle

有谁知道如何做到这一点或它叫什么?

谢谢!

根据评论更新:我的数据源是 .csv 文件,我正在尝试使用 Excel 对其进行操作。Excel 宏或 VBA 解决方案将是最好的。不幸的是,我的 SQL 非常初级,因此学习应用 SQL 解决方案将非常耗时。

4

3 回答 3

2

使用变体数组和字典对象这样的事情非常快

代码将输出转储A1:DxF1

更新:固定姓名数字

在此处输入图像描述

Sub ReCut()
Dim X
Dim Y
Dim C

Dim lngRow As Long
Dim lngCol As Collection
Dim lngCnt1 As Long
Dim lngCnt As Long
Dim objDic As Object

Set objDic = CreateObject("scripting.dictionary")
X = Range([a1], Cells(Rows.Count, "C").End(xlUp)).Value2
Y = X

ReDim Y(1 To UBound(Y), 1 To 100)

For lngCnt1 = 1 To (UBound(Y, 2) - 3)
Y(1, lngCnt1) = "Name" & lngCnt1
Next

For lngRow = 1 To UBound(X, 1)
    If objDic.exists(X(lngRow, 1) & X(lngRow, 2) & X(lngRow, 3)) Then
'find first blank entry in relevant array row
        C = Split(Join(Application.Index(Y, lngCnt), "| "), "|")
        Y(lngCnt, Application.Match(" ", C, 0)) = X(lngRow, 4)
    Else
        lngCnt = lngCnt + 1
        Y(lngCnt, 1) = X(lngRow, 1)
        Y(lngCnt, 2) = X(lngRow, 2)
        Y(lngCnt, 3) = X(lngRow, 3)
        Y(lngCnt, 4) = X(lngRow, 4)
        objDic.Add X(lngRow, 1) & X(lngRow, 2) & X(lngRow, 3), lngCnt
    End If
Next

[f1].Resize(UBound(Y, 1), UBound(Y, 2)) = Y

End Sub
于 2013-07-22T11:21:17.947 回答
1

如果您要进行 SQL 请求,您可能会查看触发器。首先,您需要遍历数据。

CREATE TRIGGER tg AFTER INSERT ON `myTable`
FOR EACH ROW
BEGIN
insert into myTable(MyNewName) values (Name);
END
;

您还需要使用 Alter Table 才能添加新列

ALTER TABLE myTable
ADD MyNewName VARCHAR

http://www.w3schools.com/sql/sql_alter.asp

并进行比较,如果Var1已经存在,你做一个 -IF条件

IF previousrecord = nextrecord 
BEGIN
     ALTER TABLE myTable
     ADD MyNewName VARCHAR
END

http://msdn.microsoft.com/fr-fr/library/ms182717.aspx

现在将所有这些与触发器结合起来:

CREATE TRIGGER tg AFTER INSERT ON `myTable`
FOR EACH ROW
BEGIN
      IF previousrecord = currentrecord // where at beginning previousrecord=firstrecord
      BEGIN
           ALTER TABLE myTable
           ADD MyNewName VARCHAR // MyNewName you can create a variable that increases
                                 // smth like $added=0 then increase it
           insert into myTable(MyNewName) values (Name);
      END

END
;

当您从输入中读取数据时,假设它是按 ID 排序的。这可能不是最终的解决方案,但它应该可以帮助您。

于 2013-07-19T14:51:17.207 回答
1

仅公式需要大量解释,但只是许多人非常熟悉的一系列操作:

  1. 选择你的四列(比如 A:D)。
  2. Data > Outline – Subtotal with At each change in: ID, 使用函数: Count, 添加小计: 检查所有, 检查Replace current subtotalsSummary below data确定。
  3. 过滤器 A:E 和 ColumnA 选择Text Filters, Contains C, OK。
  4. 在 B5 中输入,=B4然后复制到 D5
  5. 在 F5 中:

    =IF(COLUMN()<6+$E5,OFFSET($E5,COLUMN()-6-$E5,),"")

  6. 复制 F5 对面说 Z5(必要时再向右)。
  7. 将 B5:D5 和 F5:Z5 复制到最后分组的行。
  8. 取消过滤(全选)。
  9. 复制整个工作表并使用“选择性粘贴”、“值”粘贴到顶部。
  10. Remove All在小计中。
  11. 过滤 ColumnA 以仅选择Grand Count和选择(Blanks)
  12. 删除以蓝色编号的行。
  13. 删除 A 列。
  14. 将 D1 拖到 E1 并附加1
  15. 根据需要将 E1 向右拖动。
  16. 删除列 D。

于 2013-07-19T20:16:47.093 回答