2012-04-20 12 views
0

を取り除くためにしようと、私は次のテーブルを持っている -SQLクエリのヘルプ - 一時テーブルの

Resource 
-------------------- 
Id, ProjectId, Hours, ApproverId 

Project 
-------------------- 
Id, Name 

入力がApproverIdです。私はApproverIdと一致するすべての行を取得する必要があります(十分に単純です)。また、私が戻ってくるすべてのリソースについて、承認された時間が渡される時間(同じテーブル)を取得する必要があります(ビジネス要件、UIでグレー表示される)。私が今やっていることは、ApproverIdに基づいてすべてのリソースを取得し、それらを一時テーブルに格納し、次にResource.Id上で別名を実行し、別の一時テーブルに格納してから、すべてのResource.Idに対してApproverIdがでない行がである行が渡されます。一時テーブルを使用するのではなく、1つのクエリですべてを組み合わせることはできますか?

ありがとうございます!

編集:SQL Server 2008 R2を使用しています。

編集2:ここに私のストアドプロシージャがあります。私はコメントを読んだ後、少し論理を変えました。我々は、すべての一時テーブルを取り除くと、それはより速く得ることができます -

ALTER PROCEDURE GetResourceDataByApprover 
    @ApproverId UNIQUEIDENTIFIER  
AS 
    CREATE TABLE #Table1 
     (
      Id SMALLINT PRIMARY KEY 
         IDENTITY(1, 1) , 
      ResourceId UNIQUEIDENTIFIER 
     )   

    CREATE TABLE #Table2 
     (
      ResourceId UNIQUEIDENTIFIER , 
      ProjectId UNIQUEIDENTIFIER , 
      ProjectName NVARCHAR(1024)   
     ) 

    INSERT INTO #Table1 
      SELECT DISTINCT 
        ResourceId 
      FROM dbo.Resource T 
      WHERE T.ApproverId = @ApproverId 


    DECLARE @i INT 
    DECLARE @numrows INT 
    DECLARE @resourceId UNIQUEIDENTIFIER 

    SET @i = 1 
    SET @numrows = (SELECT COUNT(*) 
        FROM #Table1 
        ) 

    IF @numrows > 0 
     WHILE (@i <= (SELECT MAX(Id) 
         FROM #Table1 
        )) 
      BEGIN 
       SET @resourceId = (SELECT ResourceId 
            FROM #Table1 
            WHERE Id = @i 
           ) 


       INSERT INTO #Table2 
         SELECT 
           T.ResourceId , 
           T.ProjectId , 
           P.Name AS ProjectName 

         FROM dbo.[Resource] T 
           INNER JOIN dbo.Project P ON T.ProjectId = P.ProjectId         
         WHERE T.ResourceId = @resourceId        


       SET @i = @i + 1 
      END 

    SELECT * 
    FROM #Table1 
    SELECT * 
    FROM #Table2 

    DROP TABLE #Table1 
    DROP TABLE #Table2 
+0

あなたの現在のコードを投稿してください。あなたが試したことを知ることは役に立ちます。また、RDBMSは何ですか? – Taryn

+0

あなたが望む結果のサンプルは、おそらくもっと良いことを理解する助けになります –

+0

申し訳ありませんが、私はSQL Server 2008 R2を使用しています。私は手続き中の非関連コードを削除し、すぐにここに掲載します。 – tempid

答えて

1

このクエリでは、すべてのリソースに指定承認者と他のすべての承認者のための1のための1つを2つの行を返す必要があります。

SELECT 
    Id, 
    CASE 
    WHEN [email protected] THEN 'SpecifiedApprover' 
    ELSE 'OtherApprover' 
    END AS Approver, 
    SUM(Hours) AS Hours 
FROM Resource 
GROUP BY 
    Id, 
    CASE 
    WHEN [email protected] THEN 'SpecifiedApprover' 
    ELSE 'OtherApprover' 
    END 
0

Approverが時間を無駄にしていることを具体的に知りたいですか?

SELECT p.Id, p.Name, SUM(r.Hours) as TotalHours 
FROM Resource r 
LEFT JOIN Project p 
ON r.ProjectId = p.Id 
WHERE ApproverId = %ConcreteApproverId% 
GROUP BY p.Id, p.Name 
HAVING SUM(r.Hours) > 0 

このクエリは、このテーブルの例を生成します。

+-----+----------+-------+ 
| Id | Project | Hours | 
+-----+----------+-------+ 
| 203 | ProjectA | 25 | 
| 202 | ProjectB | 34 | 
| 200 | ProjectC | 46 | 
+-----+----------+-------+