2017-03-13 3 views
0

Microsoft SQL Server 2014를 사용합니다. 최대 행 번호를 가져 오려고합니다.동일한 행의 SQL Server 비교

예를 들어,이 테이블

------------------------------------------------------------------------ 
| Values_A | Amounts_A | Values_B | Amounts_B | Values_C | Amounts_C| 
------------------------------------------------------------------------ 
| 5000 |  50  | 3000 |  100  | 1000 | 200  | 
------------------------------------------------------------------------ 

내가이 경우 A 또는 B 또는 C 의 최대 값/금액을 얻으려면 여기에, A의 값은/금액 B의, 50분의 5,000 = 100 값/금액은 3000/100 = 30, C 값/금액은 1000/200 = 5이므로 100을 얻고 싶습니다.

말해주십시오.

답변

0

SQL Server의 MAX() 함수는 열이 아닌 레코드 컬렉션에서 최대 수를 반환하도록 설계되었습니다. 귀하의 문제에서 가장 큰 문제는 데이터가 열 사이에 퍼져 나가는 것입니다. 한 가지 방법은 UNION을 사용하여이 데이터를 unpivot 한 다음 최대 비율을 선택하는 것입니다.

WITH cte AS (
    SELECT Values_A/Amounts_A AS ratio 
    FROM yourTable 
    UNION ALL 
    SELECT Values_B/Amounts_B 
    FROM yourTable 
    UNION ALL 
    SELECT Values_C/Amounts_C 
    FROM yourTable 
) 
SELECT MAX(ratio) 
FROM cte 

이 접근법은 단일 레코드에서 올바르게 작동합니다. 당신이 당신의 테이블의 여러 레코드를 가지고 있다면, 더 추한 방법은 이것이다 :

select 
    (select 
     max(val) 
     from (values (Values_A/Amounts_A), 
        (Values_B/Amounts_B), 
        (Values_C/Amounts_C) 
     ) t (val) 
    ) max_val 
from your_table; 
: 당신은 간결 하위 쿼리에 values를 사용하여이 작업을 수행 할 수 있습니다
WITH cte AS (
    SELECT Values_A/Amounts_A AS A_ratio, 
      Values_B/Amounts_B AS B_ratio, 
      Values_C/Amounts_C AS C_ratio 
    FROM yourTable 
) 
SELECT CASE WHEN t.A_ratio > t.B_ratio 
      THEN CASE WHEN t.A_ratio > t.C_ratio THEN t.A_ratio ELSE t.C_ratio END 
      ELSE CASE WHEN t.B_ratio > t.C_ratio THEN t.B_ratio ELSE t.C_ratio END 
     END AS max_ratio 
FROM cte t