0

「開始日」、「終了日」、「割り当て %」の 3 つのフィールドを持つテーブルがあります。現在の日付から 3 か月以内に該当するこのテーブルのすべてのレコードを見つける必要があります。

そして (これは注意が必要です) Sum(Allocation %) > 100 の日付範囲が重複しているレコードのみです。

クエリを思いつくのを手伝ってください。

これがテーブル スキーマです。

Table (ResourceAssignment)
   - ResourceAssignmentID (PK)
   - ResourceID (FK)
   - Assigned To (FK)
   - Start Date
   - End Date
   - Allocation %

基本的に、特定の期間 (当日から 3 か月) 内に割り当てられたリソース全体を見つける必要があります。

前もって感謝します!

4

4 に答える 4

1

これが目的であるかどうかは正確にはわかりませんが、これにより、開始日または終了日が過去 3 か月以内である 100% を超える割り当てを持つすべての ResourceID が表示されます。

SELECT ResourceID 
FROM ResourceAssignment
WHERE StartDate BETWEEN DATEADD(month,-3,GETDATE())  AND GETDATE()
  OR EndDate BETWEEN DATEADD(month,-3,GETDATE())  AND GETDATE()
GROUP BY ResourceID 
HAVING SUM([Allocation %]) > 100
于 2013-07-17T19:32:08.403 に答える
1

2 つの一般的な解決策があります。どちらが最適かは、ResourceAllocation のサイズ、競合の頻度、およびデータの表示方法によって異なります。

解決策 1: 今後 3 か月の日付のリストを作成し、それを結合して、割り当て超過の日付を特定する

WITH
  datelist AS (
    SELECT CAST(GETDATE() AS date) [d] UNION ALL SELECT DATEADD(day,1,[d]) FROM datelist WHERE [d] < DATEADD(month,3,GETDATE())
  ),
  allocations AS (
    SELECT *,SUM([Allocation %]) OVER(PARTITION BY [ResourceID],[d]) AS [Total Allocation %]
    FROM datelist
    INNER JOIN ResourceAssignment ON ([d] BETWEEN [Start Date] AND [End Date])
  )
SELECT *
FROM allocations
WHERE [Total Allocation %] >= 100

解決策 2: ResourceAssignment の自己結合で範囲競合クエリを使用する

SELECT *
FROM (
  SELECT
    t1.*,SUM(t1.[Allocation %]) OVER(PARTITION BY t1.[ResourceID]) AS [Total Allocation %]
  FROM ResourceAssignment t1
  INNER JOIN ResourceAssignment t2 ON (
    t1.[ResourceID] = t2.[ResourceID] AND
    t1.[ResourceAssignmentID] <> t2.[ResourceAssignmentID] AND
    t1.[Start Date] < t2.[End Date] AND
    t2.[Start Date] < t1.[End Date]
  )
  WHERE
    t1.[Start Date] <= CAST(GETDATE()+30 as date) AND
    t2.[Start Date] <= CAST(GETDATE()+30 as date) AND
    t1.[End Date] > CAST(GETDATE() as date) AND
    t2.[End Date] > CAST(GETDATE() as date)
) t
WHERE [Total Allocation %] >= 100
于 2013-07-17T20:57:16.523 に答える
0

これがあなたが達成しようとしていることだと思います:

SELECT SUM(Allocation), ResourceID
FROM ResourceAssignment
WHERE EndDate BETWEEN GETDATE() AND  DATEADD(m,3,GETDATE())
GROUP BY ResourceID
HAVING SUM(Allocation) > 100
于 2013-07-17T19:32:17.493 に答える
0

開始日と終了日は日時または日付としてフォーマットされていると思います。

開始日のレコードが過去 3 か月以内に収まるか、終了日のレコードに収まるかを判断しようとしているかどうかはわかりません。

また、Sum(Allocation %) を決定するには制限が必要です。合計したい一意のレコード。割り当て % を合計してから 100 より大きいものだけを選択するため、どれをプルしてから合計するかを決定する必要があります。

これは、With ステートメントを使用するか、必要な情報を段階的に取得するサブ「テーブル」(クエリ) を作成することで実現できます。サブクエリステートメントを提示します。

Sql-Server 2008 R2 用に作成

過去 3 か月以内のデータを最初に選択

Select ResourceAssignmentID, ResourceID, [Assigned To], [Allocation %]
From ResourceAssignment
Where [Start Date] >= dateadd(Month,-3,Now)

次に、このデータを使用して、割り当て % を合計します。(2つの外部キーの組み合わせに基づいて仮定しています)

Select Query1.ResourceID, Query1.[Assigned To], sum(Query1.[Allocation %]) as Sumofallocation
From
(Select ResourceAssignmentID, ResourceID, [Assigned To], [Allocation %]
From ResourceAssignment
Where [Start Date] >= dateadd(Month,-3,Now)) Query1
Group By Query1.ResourceID, Query1.[Assigned To], sum(Query1.[Allocation %]) 

group by の前に Where ステートメントを追加して、100 を超える要件を除外することもできますが、別の Select ステートメントを追加して、すべてをまとめることができます。

Select * From
(Select Query1.ResourceID, Query1.[Assigned To], sum(Query1.[Allocation %]) as Sumofallocation
From
(Select ResourceAssignmentID, ResourceID, [Assigned To], [Allocation %]
From ResourceAssignment
Where [Start Date] >= dateadd(Month,-3,Now)) Query1
Group By Query1.ResourceID, Query1.[Assigned To], sum(Query1.[Allocation %]) 
) Query2
Where Query2.Sumofallocation > 100

また、プロジェクト管理型のプログラムも手がけているようですね。Microsoft Project は動作しませんか? 希望する時間枠で誰が過剰に割り当てられているかを確認できます。複数のプロジェクトがある場合は、それらを 1 つの大きなプロジェクト ファイルにマージして、そのように表示することができます...

とにかく、これがお役に立てば幸いです。SQL は完璧ではないかもしれませんが、実行可能な方向を示しているはずです。

于 2013-07-17T19:55:23.393 に答える