2013-10-19 55 views
1

我有3个表。首先是账户表,然后是联系表和电话表。Sql Server - 按订单发号

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

这是我迄今为止

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 

通过运行此我得到的按名称排序列表,而且数量也出现在了正确的订购。唯一的问题是,我不能确定如何获得maincontact顶部

编辑露面:输入了替代A1

+1

你说c1 maincontactid但c1没有在查询中定义。编辑了 – Hogan

+0

。应该说a1.maincontactid – iDesi

回答

1

我认为这将帮助,如果你表现出更多的数据库c1.MainContactID架构。 I.e .:如何确定某个联系人是主要联系人?

我有两个想法:

  1. 你可以使用两个单独的查询,并使用UNION命令创建一个结果集。
  2. 从我在这里看到的情况来看,我认为对于主要联系人,其ID与账户的MainContactID相对应?在这种情况下,我想你可以通过在MainContactID列上使用左外部联接来进行一个查询,然后对其进行排序?此列对其他联系人将为NULL,对吗?
+0

#2为我做了诡计。非常感谢。 – iDesi

1

目前尚不清楚是什么c1是 - 但如果它是一个连接没有证明给你主要联系人和空非主接触的ID,然后在您的查询应该是这样的:

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 
+0

我的不好。它应该是a1.MainContactID。在输入问题时犯了一个错字。这也可以,但我更喜欢马尔托的答案。 +1只是因为尽管我的错误,你仍然想出了一个解决方案。 – iDesi

+0

@Mogambo - 好吧我改变它的工作,现在我明白maincontactid存储在哪里。 – Hogan