首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MSAccess中的SQL查询根据其排序顺序对带有字母的值列进行排序

问MSAccess中的SQL查询根据其排序顺序对带有字母的值列进行排序
EN

Stack Overflow用户
提问于 2020-02-23 18:44:44
回答 1查看 226关注 0票数 2

我试图在MSAccess中的一个表上编写一个SQL查询,以添加一个虚拟列,该列将根据一个按降序排列的值列添加字母顺序。

代码语言:javascript
复制
------------------------------------------------
|    Filename    |    Zone    |    ValueCol    |
------------------------------------------------
|    abc         | Zone_MEA   |      33        |
|    abc         | Zone_DEA   |      29        |
|    abc         | Zone_SEO   |      21        |
|    abc         | Zone_GUY   |      09        |
|-----------------------------------------------
|    def         | Zone_SEO   |      30        |
|    def         | Zone_DEA   |      22        |
|    def         | Zone_MEA   |      07        |
|    def         | Zone_GUY   |      06        |
|----------------------------------------------|
|    ghi         | Zone_GUY   |      21        |
|    ghi         | Zone_MEA   |      12        |
|    ghi         | Zone_SEO   |      04        |
|    ghi         | Zone_DEA   |      04        |
------------------------------------------------

因此,在ValueCol中,在descending order中排序的所有值都将收到一个顺序字母,从每个区域集A开始。

代码语言:javascript
复制
                                                  Virtual Col
---------------------------------------------------------------
|    Filename    |    Zone    |    ValueCol    |    Letter    |
---------------------------------------------------------------
|    abc         | Zone_MEA   |      33        |       A      |
|    abc         | Zone_DEA   |      29        |       B      |
|    abc         | Zone_SEO   |      21        |       C      |
|    abc         | Zone_GUY   |      09        |       D      |
|-------------------------------------------------------------|
|    def         | Zone_SEO   |      30        |       A      |
|    def         | Zone_DEA   |      22        |       B      |
|    def         | Zone_MEA   |      07        |       C      |
|    def         | Zone_GUY   |      06        |       D      |
|-------------------------------------------------------------|
|    ghi         | Zone_GUY   |      21        |       A      |
|    ghi         | Zone_MEA   |      12        |       B      |
|    ghi         | Zone_SEO   |      04        |       C      |
|    ghi         | Zone_DEA   |      04        |       D      |
---------------------------------------------------------------

有没有一种方法可以在MSAccess中编写这样的SQL查询,而不需要创建任何物理助手表?(异常可能是一个虚拟帮助表,但不知道如何创建一个表,也不知道如何使用它。)

编辑:每个部分都是一个特定的文件名。

根据@Erik A.的建议编写了这个查询,下面是查询:

代码语言:javascript
复制
SELECT M.FILENAME, M.ZONE,M.[VALUECOL],

CHR(64 +  (
        SELECT COUNT(*) 
        FROM tblTest AS S
        WHERE 
            S.[FILENAME] = M.[FILENAME]
             AND S.[ZONE] <= M.[ZONE]
            AND S.[VALUECOL] <= M.[VALUECOL]
            AND S.[FILENAME]&S.[ZONE]&S.[VALUECOL]<=M.[FILENAME]&M.[ZONE]&M.[VALUECOL]
    ) ) AS POS

FROM tblTest AS M
GROUP BY M.[FILENAME], M.[ZONE], M.[VALUECOL]
ORDER BY M.[FILENAME] ASC, M.[VALUECOL] DESC,M.[ZONE] ASC

,

  • ,字母顺序仍然不是顺序的,从下面的输出中可以看到。
  • 还会在特定的文件名部分中获得重复字母.

​

​

Edit...once:这里取点2,即重复,但不是点1。

代码语言:javascript
复制
SELECT M.FILENAME, M.ZONE,M.[VALUECOL],

CHR(64 +  (
        SELECT COUNT(*) 
        FROM tblTest AS S
        WHERE 
            S.[FILENAME] = M.[FILENAME]
            AND S.[FILENAME]&S.[ZONE] <= M.[FILENAME]&M.[ZONE]
             AND S.[FILENAME]&S.[ZONE]&S.[VALUECOL]<=M.[FILENAME]&M.[ZONE]&M.[VALUECOL]
    ) ) AS POS

FROM tblTest AS M
GROUP BY M.[FILENAME], M.[ZONE], M.[VALUECOL]
ORDER BY M.[FILENAME] ASC, M.[VALUECOL] DESC,M.[ZONE] ASC

​

​

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-23 19:08:23

一个非常普遍的问题的解决办法:

如果您有定义良好的排序(通过没有重复项的列进行排序)和分组,则可以使用子查询来实现这一点:

看起来是这样的:

代码语言:javascript
复制
SELECT 
    (
        SELECT COUNT(*)
        From MyTable s
        WHERE 
            s.GroupingColumn1 = m.GroupingColumn1
            AND s.GroupingColumnN = m.GroupingColumnN
            AND s.SortingColumn1 <= m.SortingColumn1
    )
FROM MyTable m
GROUP BY GroupingColumn1, GroupingColumnN
ORDER BY SortingColumnN

这将使您获得组中项的位置。

您可以简单地使用ASCII表的一些知识将其转换为大写字母(A =位置65,大写字母都是顺序的,因此,通过将位置递增64,查找位置的ASCII字符,您将得到A表示1,B表示2,等等)

代码语言:javascript
复制
Chr(MyPosition + 64)

当然,如果表存储在支持窗口函数的后端中,则可以更清楚、简洁和更快地完成这一任务。不幸的是,Access不支持它们。

应该使用>和<实现排序,这使得语句在多个排序条件下相当长:

代码语言:javascript
复制
SELECT M.[FILENAME], M.[ZONE],M.[VALUECOL],

CHR(64 +  (
        SELECT COUNT(*) 
        FROM tblTest AS S
        WHERE 
            (S.[FILENAME] = M.[FILENAME])
            AND (
                           (s.VALUECOL > m.VALUECOL)
                          OR (
                                    (s.VALUECOL = m.VALUECOL) AND (s.ZONE <= m.ZONE)
                                )
                       )
            ) ) AS LETTER
FROM tblTest AS M
GROUP BY M.[FILENAME], M.[ZONE], M.[VALUECOL]
ORDER BY M.[FILENAME] ASC, M.[VALUECOL] DESC,M.[ZONE] ASC
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60365590

复制
相关文章

相似问题

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