0

概要:

ワーカーのリストに割り当てようとしている作業項目のリストがあります。各作業には、最大100個の作業項目のみを割り当てることができます。各作業項目は、それを作業する必要がある(所有者として関連付けられている)ユーザーを指定します。

例えば:

ジムは、それぞれが複数の作業項目を持つ合計5つのアカウントで作業します。合計で、ジムにはすでに50のアイテムが割り当てられています。あと50個しか割り当てられません。

私の窮状/目標:

一時テーブルとselectステートメントを使用して、各所有者が現在割り当てているアイテムの数を取得し、新しいアイテムに使用可能なスロットを計算して、値を新しい列に格納しています。所有者が所有者のリストと(一時テーブル内の)利用可能なアイテムと一致するアイテムテーブルから選択できる必要があります。各ユーザーの行数は、ユーザーごとの利用可能なスロットの数に等しいだけです-クエリ基準に一致する200が存在する場合でも、jimには50行しか返されませんが、samは、アイテムテーブルで作業するアイテムが30あるのに、使用可能なスロットがないために0行を取得する場合があります。

私はこの問題に間違って取り組んでいる可能性があることを認識しています。カーソルの使用は避けたい。

編集:いくつかのサンプルコードを追加する

SELECT
nUserID_Owner
,   CASE
        WHEN COUNT(c.nWorkID) >= 100 THEN 0
        ELSE 100 - COUNT(c.nWorkID)
    END
,COUNT(c.nWorkID)   
FROM tblAccounts cic
LEFT JOIN tblWorkItems c
ON c.sAccountNumber = cic.sAccountNumber
AND c.nUserID_WorkAssignedTo = cic.nUserID_Owner
AND c.nTeamID_WorkAssignedTo = cic.nTeamID_Owner
WHERE cic.nUserID_Collector IS NOT NULL
AND nUserID_CurrentOwner = 5288
AND c.bCompleted = 0
GROUP BY nUserID_Owner

これにより、5288、50、50の出力値が提供されます(ジムのシナリオで)

4

1 に答える 1

1

思ったより時間がかかりましたが、解決策を見つけました。

上記のようにサブクエリを使用して、ユーザーごとに一意の行数を持つワークアイテムを生成しました。

PARTITION BY を使用してワーカーごとに一意の行数を生成し、HAVING 句に行数が < 使用可能なスロットの数でなければならないことを含めました。コードを投稿しますが、文字制限を超えており、システムを適切に変更するために多くのことを変更する必要があります。

もともと私は、結果セットを関連付けるために必要なデータを作成することを考えるのではなく、結果を制限することに重点を置いて問題にアプローチしていました。

于 2013-03-22T20:58:27.327 に答える