SQL 按 4 列排序,其中 1 列按 True 和 False 排序

SQL sort by 4 columns with 1 column sorted by True and False Both

提问人:Aman Devrath 提问时间:10/26/2023 更新时间:10/27/2023 访问量:39

问:

我正在寻找一个需要按 4 列排序的销售人员列表 - IsAvailable DESC、EmailStatus DESC、FirstName ASC、LastName ASC。

  • IsAvailable(使切换按钮可编辑) - 这意味着如果销售人员 已准备好参加约会(排序 - 先对后错)
  • EmailStatus(如果为 False,则显示红色图标) - 这意味着如果 销售人员具有有效的邮箱。(排序 - 首先是 true,然后是 false,但是 如果为 false,则 isAvailable 也应为 false)。
  • 名字 和 LastName - 按 ASC 顺序排列的名字和姓氏

当前排序列表:
enter image description here

必选 :
enter image description here

必需的单词排序列表:

  1. 首先,它应该处于活动状态,具有 IsAvailable True 和 EmailStatus True & First ASC 和 Last ASC
  2. 然后,它应该处于活动或非活动状态,IsAvailable 为 True/False,但 EmailStatus 为 False、First 和 Last ASC
  3. Last 应为 IsAvailable False 和 EmailStatus True(即不带红色图标的非活动开关)、First 和 Last ASC

我尝试过的代码:

SELECT 
    {Collaborator}.*,
    {ShowroomMember}.*,
    {WorkRole}.*,
    (
        SELECT 
            COUNT({ShowroomMember}.[Id])
        FROM 
            {ShowroomMember}
        WHERE 
            {ShowroomMember}.[CollaboratorId] = {Collaborator}.[Id]    
    )
FROM {ShowroomMember}
    INNER JOIN {Collaborator} ON {Collaborator}.[Id] = {ShowroomMember}.[CollaboratorId]
    INNER JOIN {WorkRole} ON {ShowroomMember}.[WorkRoleId] = {WorkRole}.Id
WHERE
    **{ShowroomMember}.[ShowroomId] = @ShowroomId
ORDER BY {ShowroomMember}.[IsAvailable] DESC, {Collaborator}.[EmailStatus] DESC, 
{Collaborator}.[FirstName] ASC, {Collaborator}.[LastName] ASC**
mysql 联接 sql-order-by

评论

0赞 NickW 10/27/2023
可能是由于您使用图片而不是可编辑的文本而被否决 - 人们希望能够复制数据,以便他们可以尝试解决方案。此外,显示图标而不是实际数据值的图片尤其无用。虽然我同意在没有解释的情况下投反对票/投票关闭通常是无济于事的——不幸的是,这只是这个论坛的“功能”之一
0赞 NickW 10/27/2023
请使用表格中实际值的示例数据(作为可编辑的文本)和您想要实现的结果来更新您的问题。排序顺序由列出的列、列的顺序和 DESC/ASC 值确定。如果使用可用的列无法实现所需的排序顺序,则需要创建计算列,这些列在排序时会给出所需的结果

答:

0赞 Aman Devrath 10/27/2023 #1

为使用图片向社区道歉。
对于任何寻找解决方案的人,我都可以通过使用 .这是一个漫长的试错过程,因为排序不符合解决方案,因为名字和姓氏多次失败,与 IsAvailable 和 EmailStatus 混合使用。代码可能很丑陋,但它有效。您可以更新并使其看起来 .
CASEpretty

我使用了多个具有相同条件的相同条件来对相同条件应用 3 种不同的排序。WHEN

溶液:

ORDER BY
CASE WHEN {Collaborator}.[EmailStatus]=1 AND {ShowroomMember}.[IsAvailable]=1 THEN {ShowroomMember}.[IsAvailable] END DESC,
CASE WHEN {Collaborator}.[EmailStatus]=1 AND {ShowroomMember}.[IsAvailable]=1 THEN {Collaborator}.[FirstName] END ASC,
CASE WHEN {Collaborator}.[EmailStatus]=1 AND {ShowroomMember}.[IsAvailable]=1 THEN {Collaborator}.[LastName] END ASC,

CASE WHEN {Collaborator}.[EmailStatus]=1 AND {ShowroomMember}.[IsAvailable]=0 THEN {ShowroomMember}.[IsAvailable] END ASC,
CASE WHEN {Collaborator}.[EmailStatus]=1 AND {ShowroomMember}.[IsAvailable]=0 THEN {Collaborator}.[FirstName] END ASC,
CASE WHEN {Collaborator}.[EmailStatus]=1 AND {ShowroomMember}.[IsAvailable]=0 THEN {Collaborator}.[LastName] END ASC,

CASE
    WHEN {Collaborator}.[EmailStatus]=0 AND ({ShowroomMember}.[IsAvailable]=0 OR {ShowroomMember}.[IsAvailable]=1)
    THEN {Collaborator}.[FirstName] END ASC

当状态从不活动更改为活动时,Last 保留列表中销售人员的排序,反之亦然。如果我在上面的代码中使用我用于其他条件的类似方法,它会以不同的方式对其进行排序,因此我必须将 IsAvailable 的 True 和 False 组合在一起,以根据名字和姓氏保留销售人员的排序。CASECASEOR