2011-12-02 9 views
0

私と同僚に困惑している面白いジレンマがあります。私は公開されているWebサイトに公開される従業員のための電話番号指定を引き出すSQLクエリを作成しようとしています。私たちの電話システム(SQL Server 2000ベース)では、3XXXの番号(直行)、5XXX(秘書と複数回線の電話を持っている人のためのボスグループ)、および7XXX(ボイスメール)。SQL Server 2000 - セル値に基づいて多くの行の中から1行を取り出す

ほとんどの人は、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 

私は、しかし、彼らはそれらの拡張がシステムに追加されたときに、中にできるようにするために頼ることはできません。私は他の拡張機能を削除することもできません。

いくつかのケースステートメントを実行しようとしましたが、何もうまくいかずでした。以下は、私たちが使用しているSQLが非常に複雑になり、私の頭の上にある方法です。上記のルールに基づいて従業員IDと電話番号を返す、各行に1つの価値をインテリジェントに得る方法について、誰かが光を当てることができますか?ファーストネーム、ラストネームは、チェックのためのものであり、最終的なものの一部ではありません。

申し訳ありませんが、この音がたくさんあるようであれば、ここでは絶望的です。

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ユニオン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

おかげセルゲイを持つことになりますので、LEFT(extension,1)して結果をソートすることで、これは私が(いくつかの変更で)必要な正確に何をしました。 –

0

私は右のあなたを理解している場合、あなたが必要とするすべてはあなたが

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 
関連する問題