2010-06-29 2 views
1

어제 Thomasexactly the query I wanted을 제공하여 많은 도움을 받았습니다. 그리고 지금은 그것의 변종이 필요하고, 누군가가 나를 도울 수 있기를 희망합니다.SQL에서이 쿼리의 최대 값 하나만 출력하는 방법은 무엇입니까?

나는 출력 한 행, 즉 최대 값으로 원하는 -하지만 다음과 같은 쿼리의 알고리즘을 구축 할 수 있습니다

WITH Calendar AS (SELECT  CAST(@StartDate AS datetime) AS Date 
              UNION ALL 
              SELECT  DATEADD(d, 1, Date) AS Expr1 
              FROM   Calendar AS Calendar_1 
              WHERE  (DATEADD(d, 1, Date) < @EndDate)) 
    SELECT  C.Date, C2.Country, COALESCE (SUM(R.[Amount of people per day needed]), 0) AS [Allocated testers] 
    FROM   Calendar AS C CROSS JOIN 
          Country AS C2 LEFT OUTER JOIN 
          Requests AS R ON C.Date BETWEEN R.[Start date] AND R.[End date] AND R.CountryID = C2.CountryID 
    WHERE  (C2.Country = @Country) 
    GROUP BY C.Date, C2.Country OPTION (MAXRECURSION 0) 

위의 출력은 될 것 같은 :

Date   Country   Allocated testers 
06/01/2010  Chile    3 
06/02/2010  Chile    4 
06/03/2010  Chile    0 
06/04/2010  Chile    0 
06/05/2010  Chile   19 

하지만 지금 당장 필요한 것은

Allocated testers 
      19 

입니다 - 하나의 열 - 한 행 - LIMIT가 아니므로

+0

예 ** 결과 ** 사람이 필요 ** 할당 된 테스터 **, 맞습니까? –

+0

그게 맞아 ... :-) –

답변

2
WITH Calendar 
     AS (
      SELECT 
       CAST(@StartDate AS datetime) AS Date 
      UNION ALL 
      SELECT 
       DATEADD(d, 1, Date) AS Expr1 
      FROM 
       Calendar AS Calendar_1 
      WHERE 
       (DATEADD(d, 1, Date) < @EndDate) 
      ) 
SELECT TOP 1 * 
FROM 
(   
    SELECT 
    C.Date 
    ,C2.Country 
    ,COALESCE(SUM(R.[Amount of people per day needed]), 0) AS [Allocated testers] 
    FROM 
    Calendar AS C 
    CROSS JOIN Country AS C2 
    LEFT OUTER JOIN Requests AS R 
     ON C.Date BETWEEN R.[Start date] AND R.[End date] 
     AND R.CountryID = C2.CountryID 
    WHERE 
    (C2.Country = @Country) 
    GROUP BY 
    C.Date 
    ,C2.Country 
OPTION 
    (MAXRECURSION 0) 
    ) lst 
    ORDER BY lst.[Allocated testers] DESC 
@Salil 응답에서 토론 다음
+0

) 내 VS Studio에서 쿼리 작성기에 넣을 때 알려주는 내용이 너무 멋지지만 여기에 있습니다. "GROUP BY 절의 오류입니다 .쿼리 텍스트를 구문 분석 할 수 없습니다. " –

+0

안녕하세요, 작동합니다! 절대적으로 마지막 명령으로"OPTION (MAXRECURSION 0) "을 넣는 것입니다 :-) 대단히 감사합니다! –

3

사용 orderlimit

ORDER BY 'people needed DESC' LIMIT 1 

(날짜, 국가 기간 선택 매개 변수를 통해 대한 ((이미 존재하는))) 최대 값 자체는 ...

편집

SQL

에 존재하는 사용 ORDER BYTOP

select TOP 1 .... ORDER BY 'people needed' DESC 
+0

SQL Server에 LIMIT가 없습니다. 나는 당신이 MySQL에 대해 이야기하고 있다고 믿는다. –

+2

'SELECT TOP 1 ...'은 SQL 서버를위한 유사점이 될 것입니다. (* ORDER BY [사람이 필요로하는 DESC]가 끝나고 * –

+0

@Gaby : Thanx 나는 내 대답이 희망을 편집합니다. .... – Salil

1

전체 예 ..

WITH Calendar AS (SELECT  CAST(@StartDate AS datetime) AS Date 
        UNION ALL 
        SELECT  DATEADD(d, 1, Date) AS Expr1 
        FROM   Calendar AS Calendar_1 
        WHERE  (DATEADD(d, 1, Date) < @EndDate)) 
SELECT TOP 1 C.Date, C2.Country, COALESCE (SUM(R.[Amount of people per day needed]), 0) AS [Allocated testers] 
FROM Calendar AS C CROSS JOIN 
     Country AS C2 LEFT OUTER JOIN 
     Requests AS R ON C.Date BETWEEN R.[Start date] AND R.[End date] AND R.CountryID = C2.CountryID 
WHERE  (C2.Country = @Country) 
GROUP BY C.Date, C2.Country 
ORDER BY 3 DESC 
OPTION (MAXRECURSION 0) 

ORDER BY 3가 있습니다 .. SELECT 문에서 세번째 필드에 의해 순서를 의미한다 그래서 당신은 처음 두 필드를 제거하면, 그에 따라이를 변경 ..

+0

아주 좋아요, 고마워요! 내가 짧은 시간 전에 또 다른 유효한 대답을 얻었음에도 불구하고 이것을 체크 할 것입니다 - 그리고 ORDER BY 3에 관한 좋은 정보 : --) –

+0

그래서 나는 "SELECT TOP ..."와 "ORDER BY .."를 추측합니다. DESC "는 항상 함께 붙어 있습니까? ((또한,) 나는 여분의 괄호가 필요 없다는 것을 좋아한다. –

관련 문제