如何将多条记录存储到一个数据记录中?

时间:2016-10-17 14:44:33

标签: sql vba ms-access access-vba

目前,我的Access表上的数据如下所示:

Cat|    Sept 1 2016
Cat|    Sept 2 2016
Cat|    Sept 3 2016
Bobcat| Sept 1 2016
Bobcat| Sept 2 2016
Bobcat| Sept 3 2016
Bobcat| Sept 5 2016
Bobcat| Sept 6 2016
Bobcat| Sept 7 2016

我需要将数据显示为:

Cat| Sept 1 2016| Sept 2 2016| Sept 3 2016
Bobcat| Sept 1 2016| Sept 2 2016| Sept 3 2016|Null| Sept 5 2016| Sept 6 2016| Sept 7 2016

字段名称为"名称" "日期1","日期2","日期3" ...."日期31"。我不习惯使用这种格式。

当我尝试交叉表查询时,我得到的是2016年9月1日的日期| 2016年9月2日| 2016年9月3日成为我的字段名称,然后显示计数(或MAX,LAST,MIN等)。但是,我需要将这些日期显示为数据。我该怎么做?

1 个答案:

答案 0 :(得分:1)

实际上,您可以使用交叉表指定可以在非数字数据上运行的MAX()MIN()。但是,正如您可以看到列名称重复其相应的值。

TRANSFORM MAX(t.Date) AS MaxOfUDate
SELECT t.User
FROM TableData t
GROUP BY t.User
PIVOT t.UDate;

-- User     Sept 1 2016 Sept 2 2016 Sept 3 2016 Sept 5 2016 Sept 6 2016 Sept 7 2016
-- Bobcat   Sept 1 2016 Sept 2 2016 Sept 3 2016 Sept 5 2016 Sept 6 2016 Sept 7 2016
-- Cat      Sept 1 2016 Sept 2 2016 Sept 3 2016     

要获取不同的列名称,请考虑使用中间查询,然后运行交叉表:

SELECT t.ID, t.User, t.Date,
       'Day' & Day(CDate(t.Date)) As DayCol
FROM TableData t;

-- ID   User    UDate         DayCol
-- 1    Cat     Sept 1 2016   Day1
-- 2    Cat     Sept 2 2016   Day2
-- 3    Cat     Sept 3 2016   Day3
-- 4    Bobcat  Sept 1 2016   Day1
-- 5    Bobcat  Sept 2 2016   Day2
-- 6    Bobcat  Sept 3 2016   Day3
-- 7    Bobcat  Sept 5 2016   Day5
-- 8    Bobcat  Sept 6 2016   Day6
-- 9    Bobcat  Sept 7 2016   Day7

TRANSFORM MAX(q.Date) AS MaxOfUDate
SELECT q.User
FROM TableDataQ q
GROUP BY q.User
PIVOT q.DayCol;

-- User     Day1          Day2          Day3          Day5          Day6          Day7
-- Bobcat   Sept 1 2016   Sept 2 2016   Sept 3 2016   Sept 5 2016   Sept 6 2016   Sept 7 2016
-- Cat      Sept 1 2016   Sept 2 2016   Sept 3 2016     

最后,您会注意到交叉表不包含没有相应数据的连续日期(例如, Day4 )。幸运的是,您可以在PIVOT...IN()子句中指定列:

TRANSFORM MAX(q.Date) AS MaxOfUDate
SELECT q.User
FROM TableDataQ q
GROUP BY q.User
PIVOT q.DayCol IN ('Day1', 'Day2', 'Day3', 'Day4', 'Day5', 
                   'Day6', 'Day7', 'Day8', 'Day9', 'Day10',
                   'Day11', 'Day12', 'Day13', 'Day14', 'Day15', 
                   'Day16', 'Day17', 'Day18', 'Day19', 'Day20',
                   'Day21', 'Day22', 'Day23', 'Day24', 'Day25', 
                   'Day26', 'Day27', 'Day28', 'Day29', 'Day30', 'Day31');

-- User     Day1          Day2           Day3           Day4    Day5          Day6        ...
-- Bobcat   Sept 1 2016   Sept 2 2016    Sept 3 2016            Sept 5 2016   Sept 6 2016 ...
-- Cat      Sept 1 2016   Sept 2 2016    Sept 3 2016