如何按fiscalYears列首年份对合并后的SQL查询结果排序?
按fiscalYears列的第一个年份排序的实现方法
要实现按fiscalYears列中的第一个年份排序,核心是提取该列中第一个分号分隔的年份子串,将其转换为数值类型后进行排序。以下是针对不同SQL数据库的具体实现:
针对SQL Server(你当前使用STRING_AGG的场景)
在原查询的基础上添加ORDER BY子句,通过LEFT和CHARINDEX函数提取第一个年份:
SELECT projectId, STRING_AGG(FiscalYear, ';') AS fiscalYears, STRING_AGG(CAST(TA AS NVARCHAR), ';') AS tas FROM your_table GROUP BY projectId ORDER BY CAST(LEFT(fiscalYears, CHARINDEX(';', fiscalYears + ';') - 1) AS INT) ASC;
表达式说明:
fiscalYears + ';':给字符串末尾拼接分号,确保即使只有单个年份(无分号),CHARINDEX也能找到有效位置CHARINDEX(';', fiscalYears + ';'):定位第一个分号的索引位置LEFT(fiscalYears, ... -1):截取分号前的内容,即第一个年份字符串CAST(... AS INT):将年份字符串转为整数,保证按数值大小排序(避免字符串排序的潜在问题)
其他数据库的实现方式
PostgreSQL:使用
SPLIT_PART函数直接提取第一个年份:SELECT projectId, STRING_AGG(FiscalYear, ';') AS fiscalYears, STRING_AGG(TA::TEXT, ';') AS tas FROM your_table GROUP BY projectId ORDER BY SPLIT_PART(fiscalYears, ';', 1)::INT ASC;MySQL:使用
SUBSTRING_INDEX函数提取第一个年份:SELECT projectId, GROUP_CONCAT(FiscalYear SEPARATOR ';') AS fiscalYears, GROUP_CONCAT(CAST(TA AS CHAR) SEPARATOR ';') AS tas FROM your_table GROUP BY projectId ORDER BY CAST(SUBSTRING_INDEX(fiscalYears, ';', 1) AS UNSIGNED) ASC;
内容的提问来源于stack exchange,提问作者kosnkov
相关产品推荐
相关产品推荐

