首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MS访问组查询

MS访问组查询
EN

Stack Overflow用户
提问于 2015-01-20 22:59:46
回答 2查看 432关注 0票数 0

这个真的让我抓挠我的头。这有点像一个GROUP_CONCAT,但不一样。我非常肯定,仅用SQL是无法做到这一点的。我有一个查询,它在规范化的表上做翻转表。结果如下:

代码语言:javascript
复制
|_Category_|_FieldA_|_FieldB_|_FieldC_|
|----------|--------|--------|--------|
|   CAT1   |    A   |        |        | 
|----------|--------|--------|--------|
|   CAT1   |        |    B   |        | 
|----------|--------|--------|--------|
|   CAT1   |        |        |    C   | 
|----------|--------|--------|--------|
|   CAT1   |   D    |        |        | 
|----------|--------|--------|--------|
|   CAT1   |        |        |    E   |   
|----------|--------|--------|--------|
|   CAT1   |    F   |        |        | 
|----------|--------|--------|--------|

我的挑战是将其压缩为尽可能少的行,但每个单元格只有一个值。

代码语言:javascript
复制
|_Category_|_FieldA_|_FieldB_|_FieldC_|
|----------|--------|--------|--------|
|   CAT1   |    A   |    B   |    C   | 
|----------|--------|--------|--------|
|   CAT1   |    D   |        |    E   | 
|----------|--------|--------|--------|
|   CAT1   |    F   |        |        | 
|----------|--------|--------|--------|

有什么想法吗?

提前谢谢。

标记

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-21 14:21:51

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

代码语言:javascript
复制
|_Category_|_F_Name_|_F_Val__|
|----------|--------|--------|
|   CAT1   | FieldA |    A   |
|----------|--------|--------|
|   CAT1   | FieldB |    B   |
|----------|--------|--------|
|   CAT1   | FieldC |    C   |
|----------|--------|--------|
|   CAT1   | FieldB |    D   |
|----------|--------|--------|
|   CAT1   | FieldC |    E   |
|----------|--------|--------|
|   CAT1   | FieldA |    F   |
|----------|--------|--------|

如何做到这一点?

代码语言:javascript
复制
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;

若要将数据导出到新表中,请使用查询:

代码语言:javascript
复制
SELECT B.* INTO TableB
FROM (
   --above query
)  AS B;

不要忘记在TableB中添加自动编号字段(作为主键),以便能够识别每个记录。

根据我的理解,你想要转换数据。不是那么简单,因为我们需要模拟

代码语言:javascript
复制
ROW_NUMBER() OVER(PARTITION BY FieldName, ORDER BY ID)

在MS Access中不支持。如何解决这个问题?

代码语言:javascript
复制
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;

它应编制以下记录:

代码语言:javascript
复制
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)。

代码语言:javascript
复制
SELECT C.* INSERT INTO TableC
FROM TableB AS C

现在,您可以将数据枢轴化:

代码语言:javascript
复制
TRANSFORM First(A.FieldValue) AS FirstOfFieldValue
SELECT A.Category, A.TRank
FROM TableC AS A
GROUP BY A.Category, A.TRank
PIVOT A.FieldName;

结果:

代码语言:javascript
复制
Category    TRank   FieldA  FieldB  FieldC
CAT1        1       F       B       E
CAT1        2       D       C
CAT1        3       A       

干杯,

马切吉

票数 3
EN

Stack Overflow用户

发布于 2015-01-21 14:12:03

我也有同样的问题。看看:Microsoft Access condense multiple lines in a table

或者在这里获得云版本,https://www.apponfly.com/en/application/microsoft-access-2013

效果很好

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28056758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档