Sql Server-按问题排序

Sql Server-按问题排序,sql,sql-server,Sql,Sql Server,我有三张桌子。首先是account表,然后是contact表和phone表 我试图在这里写的查询要求是,对于给定的帐户,在顶部显示主要联系人及其所有电话号码,然后按姓名排序显示其余联系人。手机还必须以预定义的顺序出现。首先是家庭电话号码,然后是工作电话号码等 这就是我目前所拥有的 SELECT c.ContactID, c.FullName, p.PhoneCategory, p.Phone, a1.MainContactID FROM Contact c JOIN Phone p ON p.

我有三张桌子。首先是account表,然后是contact表和phone表

我试图在这里写的查询要求是,对于给定的帐户,在顶部显示主要联系人及其所有电话号码,然后按姓名排序显示其余联系人。手机还必须以预定义的顺序出现。首先是家庭电话号码,然后是工作电话号码等

这就是我目前所拥有的

SELECT c.ContactID, c.FullName, p.PhoneCategory, p.Phone, a1.MainContactID 
FROM Contact c
JOIN Phone p ON p.ContactID = c.ContactID
JOIN Account a1 ON a1.AccountID= c.AccountID
WHERE a1.AccountID= 1000
ORDER BY 
c.FullName, 
CASE PhoneCategory
    WHEN 'Home Phone' THEN 1
    WHEN 'Business Phone' THEN 2
    WHEN 'Cell Phone' THEN 3
    WHEN 'Fax' THEN 4
    WHEN 'Other Phone' THEN 5
    WHEN 'Email Address' THEN 6
    WHEN 'E-Mail' THEN 6
END 
通过运行此命令,我可以按名称对列表进行排序,并且数字也会以正确的顺序显示。唯一的问题是,我无法决定如何让主要联系人出现在顶部


编辑:输入了c1.MainContactID而不是a1

我认为如果您显示更多的数据库模式,会有所帮助。即:如何确定某个联系人是主要联系人

我有两个想法:

  • 可以使用两个单独的查询并使用UNION命令创建一个结果集
  • 从我在这里看到的情况来看,我假设对于主联系人,其ID与帐户的
    MainContactID
    相对应?在这种情况下,我想您可以通过在
    MainContactID
    列上使用左外部联接,然后在该列上进行排序来完成一个查询?对于其他联系人,此列将为空,对吗

  • 不清楚什么是
    c1
    ,但如果它是一个未显示的连接,为主要联系人提供id,为非主要联系人提供null,那么您的查询应该如下所示:

    SELECT c.ContactID, c.FullName, p.PhoneCategory, p.Phone, c1.MainContactID 
    FROM Contact c
    JOIN Phone p ON p.ContactID = c.ContactID
    JOIN Account a1 ON a1.AccountID= c.AccountID
    WHERE a1.AccountID= 1000
    ORDER BY 
    CASE
      WHEN a1.MainContactID = c.ContactID THEN 1
      ELSE 0
    END,
    c.FullName, 
    CASE PhoneCategory
        WHEN 'Home Phone' THEN 1
        WHEN 'Business Phone' THEN 2
        WHEN 'Cell Phone' THEN 3
        WHEN 'Fax' THEN 4
        WHEN 'Other Phone' THEN 5
        WHEN 'Email Address' THEN 6
        WHEN 'E-Mail' THEN 6
    END 
    

    您说的是c1 maincontactid,但在query.edited中未定义c1。应该说是我的错。它应该是a1.MainContactID。在打印问题时打错了字。虽然我更喜欢Martao的答案,但这也行得通+1只是因为尽管我有一个错误,你还是想出了一个解决方案。@Mogambo-好的,我现在已经知道maincontactid存储在哪里了,所以我把它改成了有效的。