2016-10-17 3 views
1

В настоящее время у меня есть данные по моей таблице доступа, выглядит следующим образом:Как хранить несколько записей в одной записи данных?

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 

с поля имен, как «Имя», «Date1 «Дата2», «Дата 3» .... «Дата31». Я застрял в этом формате.

Когда я пытаюсь использовать кросс-таблицу, я получаю то, что даты 1 сентября 2016 года | 2 сентября 2016 года | 3 сентября 2016 года станут моими именами полей, а затем отобразится счет (или MAX, LAST, MIN и т. Д.). Однако мне нужны эти даты в качестве данных. Как мне это сделать?

+0

быстро исправить, хотя это не мифологическое, чтобы скопировать и вставить транспонирование или создать его в VBA с помощью функции транспонирования. – user3553260

+0

Я рассмотрел этот метод, но это часть «отчета», который нужно создавать ежемесячно, и я, возможно, не могу этого сделать. – Macellaria

+0

Просьба показать больше образцов данных. Что произойдет, если есть несколько категорий? – Andre

ответ

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   
+0

Хороший ответ! Очень тщательно. –

+0

Спасибо, сэр! Будем надеяться, что OP согласится. – Parfait

+0

Ничего себе, спасибо, сэр! Я собираюсь дать этому попробовать! – Macellaria

Смежные вопросы