SQL;如何编写“Order By”语句,只要找到第一个匹配项就会切换

问题描述 投票:0回答:1

如果之前有人提出过这个问题,我深表歉意。

这是我原来的桌子。

用户名 用户类型 团队
本杰明·特纳 支持 猫福利协会
路易斯·贝内特 主要 猫福利协会
本杰明·特纳 支持 安达尔青年
本杰明·特纳 支持 Caretalyst
辛西娅·本德 主要 义工中心
本杰明·特纳 支持 义工中心

我想使用 Order by 重新排列它,这样主帐户将首先出现,然后是同一个团队的支持帐户。 Benjamin支持但没有主账户的其他团队,将在底部添加。

“预期结果”

用户名 用户类型 团队
路易斯·贝内特 主要 猫福利协会
本杰明·特纳 支持 猫福利协会
辛西娅·本德 主要 义工中心
本杰明·特纳 支持 义工中心
本杰明·特纳 支持 安达尔青年
本杰明·特纳 支持 Caretalyst

我试过了 “按用户类型、团队排序”导致所有主要帐户首先列出,然后是支持帐户(意味着同一团队的主要和支持不粘在一起)

用户名 用户类型 团队
路易斯·贝内特 主要 猫福利协会
辛西娅·本德 主要 义工中心
本杰明·特纳 支持 猫福利协会
本杰明·特纳 支持 义工中心
本杰明·特纳 支持 安达尔青年
本杰明·特纳 支持 Caretalyst

另一方面,如果我尝试“按团队排序,用户类型”,那么主帐户和支持帐户会粘在一起,但是没有任何 VOA 的团队将首先出现(按字母顺序排列)

用户名 用户类型 团队
本杰明·特纳 支持 Caretalyst
本杰明·特纳 支持 安达尔青年
路易斯·贝内特 主要 猫福利协会
本杰明·特纳 支持 猫福利协会
辛西娅·本德 主要 义工中心
本杰明·特纳 支持 义工中心

有什么方法可以让第一行始终是主帐户,然后是同一团队的相关支持(无论团队的字母顺序如何) 然后将在底部添加任何剩余的支持帐户(没有任何主帐户)

mysql case sql-order-by
1个回答
0
投票

所以我们要按照这些规则排序

  • 首先完成
    Team
    s(其中有一个用户具有
    Main
    UserType
  • 然后由
    Team
    (确保
    Main
    Support
    一起去)
  • 最后,在每个
    Team
    中按
    UserType
    排序:
    Main
    Support
    和所有其他

我们可以尝试这样做

with MyUsers as (
  select user_name,
         Usertype,
         Team,
         case 
           when exists (select 1 
                          from MyTable m 
                         where m.Team = Team 
                           and m.Usertype = 'Main') then 1
           else 2
         end CompleteGroupOrder,     
         case 
           when Usertype = 'Main' then 1
           when Usertype = 'Support' then 2
           else 3
         end TeamOrder
    from MyTable)

  select user_name,
         Usertype,
         Team
    from MyUsers
order by CompleteGroupOrder,
         Team, 
         TeamOrder
© www.soinside.com 2019 - 2024. All rights reserved.