Sql 按底部的特定字符串排序,然后按不同的列按字母顺序排序

Sql 按底部的特定字符串排序,然后按不同的列按字母顺序排序,sql,sql-server,Sql,Sql Server,我正在尝试订购查询,但未获得所需的结果: SELECT R.[Name] AS Project, ISNULL(P.[Name]+' - '+P.[Description], 'KanBan') AS Sprint, S.[Number] AS Story, T.[Name] AS Task, sum(CASE WHEN DatePart(dw, D.ActivityDate) = 1 THEN D.[Hours] ELSE 0 END) AS Monday, sum(CASE WH

我正在尝试订购查询,但未获得所需的结果:

SELECT R.[Name] AS Project, ISNULL(P.[Name]+' - '+P.[Description], 'KanBan') AS Sprint, S.[Number] AS Story, T.[Name] AS Task,
   sum(CASE WHEN DatePart(dw, D.ActivityDate) = 1 THEN D.[Hours] ELSE 0 END) AS Monday,
   sum(CASE WHEN DatePart(dw, D.ActivityDate) = 2 THEN D.[Hours] ELSE 0 END) AS Tuesday,
   sum(CASE WHEN DatePart(dw, D.ActivityDate) = 3 THEN D.[Hours] ELSE 0 END) AS Wednesday,
   sum(CASE WHEN DatePart(dw, D.ActivityDate) = 4 THEN D.[Hours] ELSE 0 END) AS Thursday,
   sum(CASE WHEN DatePart(dw, D.ActivityDate) = 5 THEN D.[Hours] ELSE 0 END) AS Friday,
   sum(CASE WHEN DatePart(dw, D.ActivityDate) = 6 THEN D.[Hours] ELSE 0 END) AS Saturday,
   sum(CASE WHEN DatePart(dw, D.ActivityDate) = 7 THEN D.[Hours] ELSE 0 END) AS Sunday
FROM DailyTaskHours D
INNER JOIN Task T ON D.TaskId = T.PK_Task 
INNER JOIN Story S ON T.StoryId = S.PK_Story 
LEFT JOIN Sprint P ON S.SprintId = P.PK_Sprint 
INNER JOIN Product R ON S.ProductId = R.PK_Product
GROUP BY R.[Name], P.[Name], P.[Description], S.[Number], T.[Name]
ORDER BY CASE WHEN (P.[Name]+' - '+P.[Description]) = 'KanBan' then 1 else 0 end, Project ASC, Story ASC, Task ASC
首先,我希望p.[Name]+'-'+p.[Description]为空且填充有“看板”的地方,然后按产品的字母顺序进入底部,然后在产品之后冲刺,然后是故事,然后是任务

我怎样才能完成这个

编辑:谢谢这里是最后一个查询:

SELECT R.[Name] AS Project, ISNULL(P.[Name]+' - '+P.[Description], 'KanBan') AS Sprint, S.[Number] AS Story, T.[Name] AS Task,
   sum(CASE WHEN DatePart(dw, D.ActivityDate) = 1 THEN D.[Hours] ELSE 0 END) AS Monday,
   sum(CASE WHEN DatePart(dw, D.ActivityDate) = 2 THEN D.[Hours] ELSE 0 END) AS Tuesday,
   sum(CASE WHEN DatePart(dw, D.ActivityDate) = 3 THEN D.[Hours] ELSE 0 END) AS Wednesday,
   sum(CASE WHEN DatePart(dw, D.ActivityDate) = 4 THEN D.[Hours] ELSE 0 END) AS Thursday,
   sum(CASE WHEN DatePart(dw, D.ActivityDate) = 5 THEN D.[Hours] ELSE 0 END) AS Friday,
   sum(CASE WHEN DatePart(dw, D.ActivityDate) = 6 THEN D.[Hours] ELSE 0 END) AS Saturday,
   sum(CASE WHEN DatePart(dw, D.ActivityDate) = 7 THEN D.[Hours] ELSE 0 END) AS Sunday
FROM DailyTaskHours D
INNER JOIN Task T ON D.TaskId = T.PK_Task 
INNER JOIN Story S ON T.StoryId = S.PK_Story 
LEFT JOIN Sprint P ON S.SprintId = P.PK_Sprint 
INNER JOIN Product R ON S.ProductId = R.PK_Product
GROUP BY R.[Name], P.[Name], P.[Description], S.[Number], T.[Name]
ORDER BY CASE WHEN ISNULL(P.[Name]+' - '+P.[Description], 'KanBan') = 'KanBan'
    THEN 1
    ELSE 0 END,
    Project ASC,
    Sprint ASC,
    Story ASC,
    Task ASC

只需稍微修改一下:

ORDER BY CASE WHEN ISNULL(P.[Name]+' - '+P.[Description], 'KanBan') = 'KanBan'
    THEN 0
    ELSE 1 END

问题是,在您的
ORDER BY
子句中,您永远不会得到
看板。

这可能看起来有点复杂,但我认为这是最具说明性的方法:

; WITH cte AS (
  <put your query here>
)
SELECT list
     , of
     , columns
     , including
     , the
     , kanban
     , one
FROM   cte
ORDER
    BY CASE WHEN sprint = 'KanBan' THEN 937 ELSE -937 END ASC
     , Product
     , Sprint
     , story
     , task
;以cte为例(
)
选择列表
属于
、栏
包括…在内
这个
,看板
一
来自cte
命令
根据情况,当sprint=‘看板’然后是937 ELSE-937 END ASC
,产品
,冲刺
故事
任务

P.[Name]+'-'+P.[Description])
永远不能等于
'KanBan'
。。。首先,“看板”中没有连字符。如果(P.[Name]+'-'+P.[Description])为空,则它成为看板。注意:ISNULL(P.[Name]+'-'+P.[Description],'KanBan')作为Sprinttry put'ISNULL(P.[Name]+'-'+P.[Description],'zzzzzzzz')而不是'CASE WHEN(P.[Name]+'-'+P.[Description])='KanBan'then 1 else 0 end',按子句顺序排列,参见谢谢,我如何用产品的字母顺序覆盖非“看板”sprint单元格的顺序?@davidtunell,只需在
orderby
子句中添加
Project
。它将先按重量排序,然后按字母顺序排序。