문제

내가 하려고 뷰를 만듭니다.나는 몇 가지 데이터에 나의 SQL 서버 데이터베이스를 주문하고 싶어들 mark1mark2.면 지금 나는 그들을 정렬하고 싶어 선택 mark1 누가 가장 낮 mark2 과 계산의 편차에서 다른 mark1s.테이블 보고 지금은 다음과 같이지없이 편차.

|   mark1    |    mark2    |      mass    ||    deviation |
|:-----------|------------:|:------------:||:------------:|
| 0001       |      10000  |     10,0     ||    min0001   |
| 0001       |      15000  |     12,0     ||    +20%      |
| 0002       |      11200  |     18,0     ||    min0002   |
| 0002       |      13000  |     35,5     ||    +97.2%    |
| 0002       |      14565  |     85,5     ||    375%      |
| 0003       |      15004  |     15,4     ||    min0003   |
| 0003       |      21250  |     17,4     ||    +12.9%    |
| 0003       |      60764  |     16,4     ||    6.49%     |

그리고 지금 당신은 당신이 그것을 볼 수 있듯이,의 주문 mark1mark2.지금,내 편차는 문제 란에,나는 그것을 필요로하는 가 mark1, 말 0001 (그 mark210000 지)가장 낮은 대량을 찾아에서 편차가 다른 0001 (15000).당신이 볼 수 있습니다 테이블에 있습니다.

도움이 되었습니까?

해결책

FIRST_VALUE(Transact-SQL)

첫 번째 값을 반환합에서 주문한 설정 값에 SQL 서버 2014.

파티션에서 mark1 및 순서 mark2.

다음과 같이 당신을 위해 그것을 할 수:

select T.*,
       100 * (T.mass - T.FirstMass) / T.FirstMass as Deviation
from (
     select T.*,
            first_value(T.mass) over(partition by T.mark1 order by T.mark2) as FirstMass
     from dbo.YourTable as T    
     ) as T;

SQL 바이올린

다른 팁

이 쿼리 결과를 줄 것이:

SELECT 
    *,
    (t.mass / MIN(mass) OVER (PARTITION BY mark1) - 1) * 100 AS devValue,
    CASE 
        WHEN t.mass = MIN(mass) OVER (PARTITION BY mark1) THEN 'min' + mark1 
        ELSE 
            CASE 
                WHEN t.mass > MIN(mass) OVER (PARTITION BY mark1) THEN '+'
                ELSE '-' 
            END +
            CONVERT(varchar, CONVERT(DECIMAL(10,2), (t.mass / MIN(mass) OVER (PARTITION BY mark1) - 1) * 100)) + '%'
     END AS deviation
FROM
    t
ORDER BY
    t.mark1, t.mark2
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 dba.stackexchange
scroll top