【问题标题】:special character that comes last in alphabetical order sql按字母顺序排在最后的特殊字符 sql
【发布时间】:2019-12-01 07:41:29
【问题描述】:

我需要在按列字段升序排列的结果集的最后放置一条记录。

喜欢:

SELECT "#TOTAL"...

这是用户定义的列值。

这是我想要做的:

        SELECT cnt.name as Client, NULL, NULL, NULL, ', @COL_SUM, '
        FROM
        task as tsk

        LEFT JOIN client cnt
            ON tsk.client_id = cnt.id            
        GROUP BY tsk.client_id 

        UNION ALL

        SELECT "#TOTAL#",NULL,NULL,NULL, ', @COL_SUM, '
        FROM task as tsk

        ORDER BY Client ASC

这将返回结果集为:

Client  | ... | Admin  |  Intern | ..
---------------------------------------
#TOTAL# | ... | 4      |  2      | .. <-- this row here is grand total
A       | ... | 1      |         | ..
B       | ... | 1      |  1      | ..
C       | ... | 2      |  1      | ..

我希望#TOTAL# 行最后出现。

除了z之外,哪个字符最后按字母顺序出现?

【问题讨论】:

  • 这还是太含糊不清了。您的数据是什么样的?您希望您的结果是什么样的?举个具体的例子——几乎可以肯定有比根据排序顺序捏造字符更好的方法来实现这一点。
  • 如果您想知道可以添加哪些字符以使其最后排序,这个ascii table 应该能够提供帮助。编辑:如果该链接停止工作,查找任何 ASCII 表应该可以解决问题。写 |TOTAL|{TOTAL}~TOTAL~ 应该可以解决问题。
  • @AleksG 我已经更新了我的帖子.. 希望能说清楚。
  • @LiHRaM 但请注意非拉丁字符
  • 这些数据用在哪里?如果您打算在代码中的某个位置输出它,最好将总数包含到您的 sql 中。相反,当您输出行数据时,动态添加值 - 然后输出总计。这样它就永远是最后的。

标签: mysql sql sorting


【解决方案1】:

只需将您的条件添加到ORDER BY 子句:

order by Client = '#TOTAL#', Client

【讨论】:

    【解决方案2】:

    您可以向各个查询添加另一个常量列,以指示它是总计行还是常规行,并首先按此排序。

    SELECT *
           FROM (SELECT 0 first_order,
                        cnt.name client,
                        ...
                 UNION ALL
                 SELECT 1 first_order,
                        '#TOTAL#' client,
                        ...) x
           ORDER BY first_order,
                    client;
    

    【讨论】:

      【解决方案3】:

      试试这个代码变体。

      对于mysql

          SELECT 0 as [OrderBy], cnt.name as Client, NULL, NULL, NULL, ', @COL_SUM, '
          FROM
          task as tsk 
          LEFT JOIN client cnt
              ON tsk.client_id = cnt.id            
          GROUP BY tsk.client_id      
          UNION ALL
          SELECT 1 , "#TOTAL#",NULL,NULL,NULL, ', @COL_SUM, '
          FROM task as tsk
          ORDER BY [ORDERBY], cLIENT_ID
      

      sql server

          SELECT * FROM (
          SELECT TOP 100 PERCENT cnt.name as Client, NULL, NULL, NULL, ', @COL_SUM, '
          FROM
          task as tsk 
          LEFT JOIN client cnt
              ON tsk.client_id = cnt.id            
          GROUP BY tsk.client_id 
          ORDER BY TSK.CLIENT_ID) AS DATA
          UNION ALL
          SELECT "#TOTAL#",NULL,NULL,NULL, ', @COL_SUM, '
          FROM task as tsk
      

      由于您无法在查询的第一部分应用 order by,因此有一种方法可以做到这一点,top 100 percent,您可以在内部查询或子查询中应用 order by 子句。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-06
        • 1970-01-01
        • 2021-10-28
        相关资源
        最近更新 更多