2015-08-21 37 views
0

我运行以下查询string_agg(DISTINCT grades, '|'),它按此顺序执行并输出我的结果01|02|03|04|05|KG|PKPostgresql排序string_agg

我该如何重新排列它PK|KG|01|02|03|04|05

SELECT 
     U.CUSTOM_100000001 AS USERID 
    , SC.TITLE 
    , U.FIRST_NAME 
    , U.LAST_NAME 
    , string_AGG(DISTINCT SGL.short_name, '|') 
FROM 
     USERS U 
    , COURSE_PERIODS CP 
    , SCHOOLS SC 
    , school_gradelevels SGL 
WHERE 
    CP.SCHOOL_ID=SC.ID 
     AND 
    U.STAFF_ID = CP.TEACHER_ID 
     AND 
    SGL.SCHOOL_ID = SC.ID 
     AND 
    CP.SYEAR =2015 
     AND 
    SGL.short_name in('PK','KG','01','02','03','04','05','06','07','08') 
     AND 
    SC.CUSTOM_327 IN ('0021','0025','0051','0061','0071','0073','0081','0101','0111','0131','0211','0‌​221','0294','0301','0321','0341','0361','0371','0291') 
GROUP BY 
    U.CUSTOM_100000001, SC.TITLE, U.FIRST_NAME, U.LAST_NAME 
+0

您可以将其余查询添加到您的问题中吗?即整个'SELECT'声明 – dsh

+0

选择 U.CUSTOM_100000001 AS USERID, SC.TITLE, U.FIRST_NAME, U.LAST_NAME, string_AGG(DISTINCT SGL.short_name, '|') 来自用户的ü , COURSE_PERIODS CP, 学校SC, school_gradelevels SGL WHERE CP.SCHOOL_ID = SC.ID AND U.STAFF_ID = CP.TEACHER_ID AND SGL.SCHOOL_ID = SC.ID AND CP.SYEAR = 2015 和SGL.short ('PK','KG','01','02','03','04','05','06','07','08')中的_name AND SC.CUSTOM_327 IN '0021', '0025', '0051', '0061', '0071', '0073', '0081', '0101', '0111', '0131', '0211', '0221','0294 ”, '0301', '0321', '0341', '0361', '0371', '0291') GROUP BY U.CUSTOM_100000001, SC.TITLE, U.FIRST_NAME, U.LAST_NAME – user3263892

回答

3

有可能在PostgreSQL的9.0或更高版本:

SELECT 
    string_agg(DISTINCT SGL.short_name 
      , '|' ORDER BY 
       (substring(SGL.short_name, '^[0-9]+'))::int NULLS FIRST, 
       substring(SGL.short_name, '[^0-9_]+$') DESC) 
FROM school_gradelevels SGL; 

测试例如:

WITH tbl(grade) AS (
    VALUES 
    ('01'), 
    ('02'), 
    ('03'), 
    ('PK'), 
    ('KG') 
) 
SELECT grade 
FROM tbl 
ORDER BY (substring(grade, '^[0-9]+'))::int NULLS FIRST, substring(grade, '[^0-9_]+$') DESC; 

结果:

grade 
------- 
PK 
KG 
01 
02 
03 
(5 rows) 

Aggregate Expressions

+0

使用DISTINCT集合获取此错误,ORDER BY表达式必须出现在参数列表中LINE 13 – user3263892

+0

错误消息或多或少都是不言自明的。你可以为你的表模式/数据创建http://sqlfiddle.com/吗? –