• Uday3421 (5/3/2015)


    ID A B C AVG

    ------------------------

    1 08 09 10 -

    ------------------------

    2 10 25 26 -

    ------------------------

    3 09 15 16 -

    ------------------------

    Friends,

    I want to calculate the average of the larges two number from the column A,B & C for particular identity and store that average in the AVG column,

    PLz help me out.......

    Thank you.

    Few ways of doing this, here is one

    😎

    USE tempdb;

    GO

    SET NOCOUNT ON;

    DECLARE @TAVG TABLE

    (

    ID INT NOT NULL

    ,A NUMERIC(12,2) NOT NULL

    ,B NUMERIC(12,2) NOT NULL

    ,C NUMERIC(12,2) NOT NULL

    ,[AVG] INT NULL

    );

    INSERT INTO @TAVG(ID,A,B,C)

    VALUES

    (1,08.0,09.0,10.0)

    ,(2,10.0,25.0,26.0)

    ,(3,09.0,15.0,16.0);

    ;WITH BASE_DATA AS

    (

    SELECT

    A.ID

    ,ROW_NUMBER() OVER

    (

    PARTITION BY A.ID

    ORDER BY X.VAL DESC

    ) AS X_DRID

    ,X.VAL

    FROM @TAVG A

    CROSS APPLY

    (

    SELECT A.A UNION ALL

    SELECT A.B UNION ALL

    SELECT A.C

    ) AS X(VAL)

    )

    ,AVG_DATA AS

    (

    SELECT

    BD.ID

    ,AVG(BD.VAL) AS AVG_VAL

    FROM BASE_DATA BD

    WHERE BD.X_DRID < 3

    GROUP BY BD.ID

    )

    UPDATE TA

    SET TA.[AVG] = AD.AVG_VAL

    FROM @TAVG TA

    INNER JOIN AVG_DATA AD

    ON TA.ID = AD.ID

    ;

    SELECT

    A.ID

    ,A.A

    ,A.B

    ,A.C

    ,A.[AVG]

    FROM @TAVG A;

    Results

    ID A B C AVG

    --- ------ ------------ -----

    1 8.00 9.00 10.00 9

    2 10.00 25.00 26.00 25

    3 9.00 15.00 16.00 15