2015-01-20 119 views
0

这个真的让我挠了挠头。它有点像GROUP_CONCAT,但不同。我很确定没有办法只用SQL来做到这一点。我有一个查询,在规范化的表上做翻转表。结果看起来像这样:MS ACCESS小组查询

|_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 |  |  | 
|----------|--------|--------|--------| 

任何想法?

在此先感谢。

马克

+0

“压缩” ......基于什么条件? – 2015-01-20 23:08:51

+0

如果你想正常化它,我建议重新设计它。你有没有机会这样做? – 2015-01-20 23:10:49

+0

下面的链接应该给你答案: http://stackoverflow.com/questions/5517233/ms-access-query-concatenating-rows-through-a-query – 2015-01-21 02:11:10

回答

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; 

不要忘记添加自动编号字段(如主键)表B要能够识别每个记录。

根据我的理解,您要旋转数据。这并非如此简单,因为我们需要模拟

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)“错误消息。所以,最后,你应该将这些数据导出到另一个表中(比如说表C)。现在

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  

干杯,
马切伊

+0

排名部分是我错过了!非常棒 - 非常感谢! – user1956557 2015-01-21 21:27:19

+0

非常欢迎;)如果我的答案是有用的,请接受它。 – 2015-01-21 21:51:38