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