2015-01-20 7 views
0

Это действительно заставляет меня почесывать голову. Это похоже на GROUP_CONCAT, но другое. Я уверен, что нет никакого способа сделать это только с SQL. У меня есть запрос, который делает флип-таблицу на нормализованной таблице. Результат выглядит следующим образом:MS ACCESS Group Query

|_Category_|_FieldA_|_FieldB_|_FieldC_| 
|----------|--------|--------|--------| 
| CAT1 | A |  |  | 
|----------|--------|--------|--------| 
| CAT1 |  | B |  | 
|----------|--------|--------|--------| 
| CAT1 |  |  | C | 
|----------|--------|--------|--------| 
| CAT1 | D |  |  | 
|----------|--------|--------|--------| 
| CAT1 |  |  | E | 
|----------|--------|--------|--------| 
| CAT1 | F |  |  | 
|----------|--------|--------|--------| 

Моя задача состоит в том, чтобы сжать его в качестве нескольких строк, как это возможно, но только одно значение ячейки.

|_Category_|_FieldA_|_FieldB_|_FieldC_| 
|----------|--------|--------|--------| 
| CAT1 | A | B | C | 
|----------|--------|--------|--------| 
| CAT1 | D |  | E | 
|----------|--------|--------|--------| 
| CAT1 | F |  |  | 
|----------|--------|--------|--------| 

Любые идеи?

Заранее спасибо.

Mark

+0

"Сжать" ... основанный на каком состоянии? –

+0

Если вы хотите нормализовать его, я бы предложил его переделать. У вас есть шанс сделать это? –

+0

Ссылка ниже должна дать вам ответ: http://stackoverflow.com/questions/5517233/ms-access-query-concatenating-rows-through-a-query –

ответ

3

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

|_Category_|_F_Name_|_F_Val__| 
|----------|--------|--------| 
| CAT1 | FieldA | A | 
|----------|--------|--------| 
| CAT1 | FieldB | B | 
|----------|--------|--------| 
| CAT1 | FieldC | C | 
|----------|--------|--------| 
| CAT1 | FieldB | D | 
|----------|--------|--------| 
| CAT1 | FieldC | E | 
|----------|--------|--------| 
| CAT1 | FieldA | F | 
|----------|--------|--------| 

Как это достичь?

SELECT A.Category, "FieldA" AS FieldName, A.FieldA AS FieldValue 
FROM TableA AS A 
WHERE NOT A.FieldA IS NULL 
UNION ALL 
SELECT A.Category, "FieldB", A.FieldB 
FROM TableA AS A 
WHERE NOT A.FieldB IS NULL 
UNION ALL 
SELECT A.Category, "FieldC", A.FieldC 
FROM TableA AS A 
WHERE NOT A.FieldC IS NULL; 

Чтобы экспортировать данные в новую таблицу, используйте запрос:

SELECT B.* INTO TableB 
FROM (
    --above query 
) AS B; 

Не забудьте добавить Autonumber поле (как первичный ключ) для TableB, чтобы быть в состоянии идентифицировать каждую запись.

В соответствии с моим пониманием вы хотите сворачивать данные. Это не так просто, потому что нам нужно имитировать

ROW_NUMBER() OVER(PARTITION BY FieldName, ORDER BY ID) 

, который не поддерживается в MS Access. Как обходиться?

SELECT B.ID, B.Category, B.FieldName, B.FieldValue, 
     (SELECT COUNT(A.FieldName) 
     FROM TableB AS A 
     WHERE A.FieldName=B.FieldName AND A.ID >=B.ID 
     GROUP BY A.FieldName) AS TRank 
FROM TableB AS B; 

Она должна производить ниже набора записей:

ID Category FieldName FieldValue TRank 
1 CAT1  FieldA  A   3 
2 CAT1  FieldA  D   2 
3 CAT1  FieldA  F   1 
4 CAT1  FieldB  B   1 
5 CAT1  FieldC  C   2 
6 CAT1  FieldC  E   1 

Но ... вы не можете использовать выше запрос в качестве источника данных поворота, из-за "Ядро базы данных Microsoft Access не распознавать как допустимое имя или выражение поля. (Ошибка 3070) "сообщение об ошибке. Итак, наконец, вы должны экспортировать эти данные в другую таблицу (скажем, TableC).

SELECT C.* INSERT INTO TableC 
FROM TableB AS C 

Теперь вы можете поворачивать данные:

TRANSFORM First(A.FieldValue) AS FirstOfFieldValue 
SELECT A.Category, A.TRank 
FROM TableC AS A 
GROUP BY A.Category, A.TRank 
PIVOT A.FieldName; 

Результат:

Category TRank FieldA FieldB FieldC 
CAT1  1  F  B  E 
CAT1  2  D  C 
CAT1  3  A  

Cheers,
Maciej

+0

Ранжирующая часть была тем, что мне не хватало! Отлично работает - Спасибо вам большое! – user1956557

+0

Вы очень кстати;) Если бы мой ответ был полезен, пожалуйста, примите его. –

0

У меня была та же проблема. Посмотрите на: Microsoft Access condense multiple lines in a table

или получить версию облака здесь https://www.apponfly.com/en/application/microsoft-access-2013

работает довольно хорошо

+0

Это эквивалент функции MySQL Group_Concat, которая близка к тому, что мне нужно, но не совсем так, поскольку она объединяет все строки в группе в одну строку с разделительными данными. – user1956557