挑选一个排出来很多我已经得到了难倒我和同事一个有趣的两难境地。我正在尝试构建一个sql查询,这将允许我将电话扩展插件发布到公共网站上。在我们的电话系统(基于SQL Server 2000)中,一个用户最多可以有三个分机(目前为止):一个3XXX号码(直线),一个5XXX(老板组,用于一个秘书和多线电话的人)和一个7XXX(语音信箱)。的SQL Server 2000 - 基于单元格的值
大多数人无论是3XXX或7XXX扩展。只有少数人拥有5XXX,但我们也有通过升级获得更多数量的人。例如,一名教师(只有语音邮件/ 7XXX)被提升为协助负责人,并获得一条直线/ 3XXX,然后成为一名主任并获得一名秘书,从而成为一名5XXX。
我们希望在5XXX的顺序,然后再3XXX 7XXX公布这些数字,所以大多使用ORDER BY直连路由的是窗外。我已经得到了查询的地步,它会返回这样的:
UserID | Extension |Employee ID
-------------------------------
USER 1 | 3234 |1234
USER 1 | 5235 |1234
USER 1 | 7364 |1234
我不能,然而,依靠以使他们可以,因为当他们的扩展名被添加到系统上。我也无法控制移除其他分机。
我们尝试做一些case语句,但碰到了什么非常好。下面是我们正在使用的SQL,它变得非常复杂并且超出我的头脑。任何人都可以发出一些信息,告诉我们如何在每行中智能地获得一个值,以便根据上面的规则返回员工ID和电话扩展?名字,姓氏的东西只是为了检查,而不是最终的一部分。
很抱歉,如果这听起来好像很多,刚开过来绝望。
SELECT DISTINCT
FirstName, LastName, PrimaryFaxNumber, MAX(CASE WHEN Expr1 IS NOT NULL THEN Expr1 ELSE CASE WHEN Expr2 IS NOT NULL
THEN Expr2 ELSE Expr3 END END) AS Extension
FROM (SELECT sub.FirstName, sub.LastName, sub.PrimaryFaxNumber, da.DtmfAccessId, CASE WHEN LEFT(CAST(da.DtmfAccessId AS nvarchar), 1)
= '5' THEN da.DtmfAccessId END AS Expr1, CASE WHEN LEFT(CAST(da.DtmfAccessId AS nvarchar), 1)
= '3' THEN da.DtmfAccessId END AS Expr2, CASE WHEN LEFT(CAST(da.DtmfAccessId AS nvarchar), 1)
= '7' THEN da.DtmfAccessId END AS Expr3
FROM Subscriber sub FULL OUTER JOIN
DtmfAccessId da ON da.ParentObjectId = sub.SubscriberObjectId
WHERE (sub.SubscriberObjectId IS NOT NULL) AND (sub.PrimaryFaxNumber IS NOT NULL) AND (CAST(da.DtmfAccessId AS BIGINT) < 9999))
DERIVEDTBL
GROUP BY FirstName, LastName, PrimaryFaxNumber
ORDER BY LastName, FirstName
感谢谢尔盖,这正是我需要(有一些修改)。 –