0

我有两张表PersonPersonSkill

ID 姓名
1 人 1
2 人 2
3 人 3

个人技能

PERSON_ID 技能 种类
1 唱歌 20
1 俏皮 10
2 唱歌 10
1 30
1 SQL 40

我正在尝试编写一个顺序,按字母顺序按技能对人员进行排序,但最后是空值。

寻找这样的东西:

SELECT distinct
  p.*,
  STUFF(
    (SELECT ',' + ps.SKILL
      FROM PersonSkill ps
      WHERE ps.PERSON_ID = p.ID
      ORDER BY ps.SORT
      FOR XML PATH('')
    ), 1, 1, '') sortRule
FROM Person p
ORDER BY IIF(sortRule is null, 1, 0) asc, sortRule asc

但由于某种原因,我不能在 ORDER BY 的一个IIF或一个case操作中使用 sortRule,因为它给了我这个错误:Invalid column name 'sortRule'.

如果我STUFF sortRule从 select 语句中删除它,它会告诉我在使用时它必须在那里distinct。我也不能只是将STUFFdown 复制到 order by,因为它会说:ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

4

1 回答 1

1

当您执行字符串聚合时,您应该使用 a GROUP BY,而不是DISTINCT. 至于排序sortRule,您不能将列的别名包装在ORDER BY. 因此,一种方法是使用 CTE:

WITH CTE AS(
    SELECT p.Id,
           p.[Name],
           STUFF((SELECT ',' + ps.SKILL
                  FROM dbo.PersonSkill ps
                  WHERE ps.PERSON_ID = p.ID
                  ORDER BY ps.SORT
                  FOR XML PATH(''),TYPE).value('(./text())[1]','varchar(MAX)'),1,1,'') AS sortRule
    FROM dbo.Person p
    GROUP BY p.Id,
             p.[Name])
SELECT *
FROM CTE
ORDER BY CASE WHEN sortRule IS NULL THEN 1 ELSE 0 END,
         sortRule;

db<>小提琴

于 2021-10-21T13:49:42.930 回答