Sql MS访问组查询

Sql MS访问组查询,sql,vba,ms-access,Sql,Vba,Ms Access,这一次真让我抓狂。这有点像一个团体,但不同。我很确定,只有SQL是无法做到这一点的。我有一个查询,它在规范化的表上执行翻转表。结果如下所示: |_Category_|_FieldA_|_FieldB_|_FieldC_| |----------|--------|--------|--------| | CAT1 | A | | | |----------|--------|--------|--------| | CAT1 |

这一次真让我抓狂。这有点像一个团体,但不同。我很确定,只有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   |        |        | 
|----------|--------|--------|--------|
有什么想法吗

提前谢谢


马克

我也有同样的问题。看看:

或者在这里获取云版本


效果很好

我也有同样的问题。看看:

或者在这里获取云版本


效果很好

我也有同样的问题。看看:

或者在这里获取云版本


效果很好

我也有同样的问题。看看:

或者在这里获取云版本


非常好

正如我在对问题的评论中提到的,规范化的表应该如下所示:

|_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)”错误消息,您无法将上述查询用作透视数据源。所以,最后,您应该将这些数据导出到另一个表中(比如TableC)

现在,您可以透视数据:

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       
干杯,

Maciej

正如我在对问题的评论中提到的,规范化表应该如下所示:

|_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)”错误消息,您无法将上述查询用作透视数据源。所以,最后,您应该将这些数据导出到另一个表中(比如TableC)

现在,您可以透视数据:

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       
干杯,

Maciej

正如我在对问题的评论中提到的,规范化表应该如下所示:

|_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)”错误消息,您无法将上述查询用作透视数据源。所以,最后,您应该将这些数据导出到另一个表中(比如TableC)

现在,您可以透视数据:

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       
干杯,

Maciej

正如我在对问题的评论中提到的,规范化表应该如下所示:

|_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)”错误消息,您无法将上述查询用作透视数据源。所以,最后,您应该将这些数据导出到另一个表中(比如TableC)

现在,您可以透视数据:

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       
干杯,

Maciej

“压缩”。。。基于什么条件?如果你想正常化,我建议重新设计。你有机会这样做吗?下面的链接应该会给你答案:数据库是标准化的。实际表格包含类别字段、指定分区的字段和值的第三个字段。翻转时,每个分区都成为一列。查询中的每一行都包含一个除法值。客户希望数据“压缩”——第一个项目用于第1部分,第一个项目用于第2部分,第3部分的第一个项目出现在该类别的第一个fow上。您可以在我需要的结果示例中看到这种模式。提供的示例是MySQL中Group_Concat函数的等价物。很接近,但不是我所需要的。Group_Concat为分组字段创建一个带分隔符的列表和一行。我需要的是,在类别中有最多项的列中,每个项都有一行,在示例中,它是一个字段“Compress”。。。基于什么条件?如果你想正常化,我建议重新设计。你有机会这样做吗?下面的链接应该会给你答案:数据库是标准化的。实际表格包含类别字段、指定分区的字段和值的第三个字段。翻转时,每个分区都成为一列。查询中的每一行都包含一个除法值。客户希望数据“压缩”——第一个项目用于第1部分,第一个项目用于第2部分,第3部分的第一个项目出现在该类别的第一个fow上。您可以在我需要的结果示例中看到此模式。提供的示例是Group_Concat函数的等价项