MS ACCESS组查询

时间:2015-01-20 22:59:47

标签: sql vba ms-access

这个真让我挠头。它有点像GROUP_CONCAT,但不同。我非常确定没有办法只使用SQL。我有一个查询,在规范化的表上执行翻转表。结果如下:

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

任何想法?

提前致谢。

标记

2 个答案:

答案 0 :(得分: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;

要将数据导出到新表中,请使用query:

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

不要忘记将自动编号字段(作为主键)添加到 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       

干杯,
马切伊

答案 1 :(得分:0)

我遇到了同样的问题。看看:Microsoft Access condense multiple lines in a table

或在此处获取云版https://www.apponfly.com/en/application/microsoft-access-2013

效果很好