2011-12-02 29 views
0

挑选一个排出来很多我已经得到了难倒我和同事一个有趣的两难境地。我正在尝试构建一个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 

回答

1

做一个选择所有5xxx UNION 3xx但不是5xxx联合7xxx但不是5xxx或3xxx。

实际查询将是这样的:

SELECT DISTINCT EmployeeID, Extension 
    FROM AccessId 
     WHERE LEFT(CAST(Extension AS nvarchar), 1)='5' 
UNION 
SELECT DISTINCT EmployeeID, Extension 
    FROM AccessId 
     WHERE LEFT(CAST(Extension AS nvarchar), 1)='3' 
      AND NOT EXIST (
       SELECT EmployeeID FROM AccessId 
        WHERE LEFT(CAST(Extension AS nvarchar), 1)='5') 
UNION 
SELECT DISTINCT EmployeeID, Extension 
    FROM AccessId 
      WHERE LEFT(CAST(Extension AS nvarchar), 1)='7' 
       AND NOT EXIST (
        SELECT EmployeeID FROM AccessId 
         WHERE LEFT(CAST(Extension AS nvarchar), 1)='3' 
          OR LEFT(CAST(Extension AS nvarchar), 1)='5'); 

有可能存在虽然更快的解决方案。

+0

感谢谢尔盖,这正是我需要(有一些修改)。 –

0

如果我理解你的权利,你需要的是通过LEFT(extension,1)你的结果进行排序,所以你将有

SELECT * FROM (your_your_query)a 
ORDER BY a.user_id, CASE LEFT(a.extension,1) 
WHEN '5' THEN 1 
WHEN '3' THEN 2 
WHEN '7' THEN 3 
ELSE 4 
END