由于数据库中的字段太多,我需要压缩一些ms访问的表。目前的情况如下:
ID Class Date
123 101 1/1/1111
123 202 2/2/2222
123 303 3/3/3333
456 111 4/4/4444
456 222 5/5/5555
456 333 6/6/6666
我需要的表格是这样的:
ID Class(1) Date(1) Class(2) Date(2) Class(3) Class(3) ..... etc
123 101 1/1/1111 202 2/2/2222 303 3/3/3333 ..... etc
456 111 4/4/4444 222 5/5/5555 333 6/6/6666 ..... etc
ID没有标准数量的条目,有些数据可能会重复。有没有办法做到这一点?
感谢您的回复。
答案 0 :(得分:1)
我认为你的例子是倒退的(你有什么,你需要什么)。
此数据的正确表格格式是垂直的(如第一个示例),而不是水平格式。 (如果要水平显示它,可以通过查询进行演示 - 但实际上不应该以这种方式构建表。)
要转换横向格式,一种方法是这样的:
INSERT INTO myNewTable
(ID, class, date)
SELECT
ID,
Class(1),
Date(1)
FROM
myOldTable
WHERE
Class(1) IS NOT NULL
UNION
(ID, class, date)
SELECT
ID,
Class(2),
Date(2)
FROM
myOldTable
WHERE
Class(2) IS NOT NULL
UNION
...
答案 1 :(得分:1)
我会告诉你如何处理这个问题...这不是一种可抽象/可重复使用的函数类型的方法 - 只是一种实用的,可以完成的事情。< / p>
0)复制旧表进行备份。
1)为原始表提供唯一的记录标识符。在表设计中添加一个名为'pk'的列,单击小键按钮。保存后确保使用自动递增的整数填充。
2)使用列创建新表:pk,id,class1,date1,class2,date2,...,classn,daten。你可以做一个
select id, count(class) from table order by count(class) desc.
快速查看您需要创建的字段数。
2)插入#1
Insert into newtable (pk, id, class1, date1)
select min(pk) id, class, date from oldtable
3)删除#1
Delete from oldtable
where pk in(select pk from newtable)
4)更新#1
Update newtable a
set a.pk = b.pk, a.class2 = b.class, a.date2 = b.date
FROM (select min(pk) pk, id, class, date from oldtable) b
5)删除#2(重复步骤3)
6)更新#2(重复步骤4,但将2更改为3)。即:
Update newtable a
set a.pk = b.pk, a.class3 = b.class, a.date3 = b.date
FROM (select min(pk) pk, id, class, date from oldtable) b
......等等,直到旧桌子上没有剩下的记录。
就像我说的 - 这是不可重用的,你必须在每个循环上修改它等等。如果你知道如何使用ADO记录集等,你可以把它转换成更抽象/更新的东西。可用,但听起来不会多次使用它。
祝你好运。