私と同僚に困惑している面白いジレンマがあります。私は公開されている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
おかげセルゲイを持つことになりますので、
LEFT(extension,1)
して結果をソートすることで、これは私が(いくつかの変更で)必要な正確に何をしました。 –