2012-04-20 1 views
0

나는 다음과 같은 테이블이 임시 테이블을 제거합니다. ApproverId와 일치하는 모든 행을 검색해야합니다 (충분히 간단 함). 그리고 내가 가져온 모든 리소스에 대해 승인 된 ID가 전달되지 않은 시간 (동일한 테이블)을 가져와야합니다 (비즈니스 요구 사항, UI에서 회색으로 표시됨). 내가 지금하고있는 일은 - ApproverId를 기반으로 모든 리소스를 가져 와서 임시 테이블에 저장 한 다음 Resource.Id에서 고유 한 작업을 수행하여 다른 임시 테이블에 저장 한 다음 모든 Resource.Id에 대해 ApproverId가 이 아니고 행이 인 행. 임시 테이블을 사용하는 대신 단일 쿼리로 모두 결합 할 수 있습니까?SQL 쿼리 도움말 -</p> <pre><code>Resource -------------------- Id, ProjectId, Hours, ApproverId Project -------------------- Id, Name </code></pre> <p>입력은 ApproverId입니다 - 노력은

감사합니다.

편집 : 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

현재 코드를 게시하시기 바랍니다 :

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 

이 쿼리는이 테이블의 예를 생성합니다. 당신이 시도한 것을 보는 것이 도움이됩니다. 또한 RDBMS는 무엇입니까? – Taryn

+0

더 나은 질문을 이해하는 데 도움이되는 결과를 얻으려는 샘플을 –

+0

죄송합니다. SQL Server 2008 R2를 사용하고 있습니다. 내 절차에서 관련성없는 코드를 제거하고 곧 게시 할 예정입니다. – tempid

답변

1

이 쿼리는 모든 자원 승인자를 지정하고 다른 모든 승인자에 대해 하나 하나에 대한 두 개의 행을 반환해야합니다.

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가 자신의 시간을 얼마나 낭비했는지 알고 싶습니까?

+-----+----------+-------+ 
| Id | Project | Hours | 
+-----+----------+-------+ 
| 203 | ProjectA | 25 | 
| 202 | ProjectB | 34 | 
| 200 | ProjectC | 46 | 
+-----+----------+-------+ 
관련 문제