Update - W. Average Query

  • I need help with UPDATE Query. I have this data in tables and want to update weighted average in table tblData3 - (TValue * BPrice) .... / SUM(TValue)

    create table tblData1
    (
    IDate date,
    PID varchar(20),
    SID varchar(20),
    TValue float
    )

    insert into tblData1 values ('10/15/2019','4567','ABC',4567.34)
    insert into tblData1 values ('10/15/2019','4567','ABC',5678.34)
    insert into tblData1 values ('10/15/2019','3456','ABC',3494.56)
    insert into tblData1 values ('10/15/2019','3456','TMZ',2323.98)
    insert into tblData1 values ('10/15/2019','3456','TMZ',234.78)
    insert into tblData1 values ('10/15/2019','3456','TMZ',345.24)
    insert into tblData1 values ('10/15/2019','1358','PQR',2896.24)
    insert into tblData1 values ('10/15/2019','1358','PQR',2345.23)
    insert into tblData1 values ('10/15/2019','1358','XYZ',2332.23)
    insert into tblData1 values ('10/15/2019','1358','ABC',3333.33)

    create table tblData2
    (
    PID varchar(20),
    SID varchar(20),
    BPrice float,
    )

    insert into tblData2 Values ('4567','ABC',103.24)
    insert into tblData2 values ('3456','ABC',202.24)
    insert into tblData2 values ('3456','TMZ',56.24)
    insert into tblData2 values ('1358','PQR',50.25)
    insert into tblData2 values ('1358','XYZ',235.24)
    insert into tblData2 values ('1358','ABC',238.24)

    create table tblData3
    (
    PID varchar(20),
    SID varchar(20),
    BWAvg float
    )

  • What have you tried so far?

    The absence of evidence is not evidence of absence.
    Martin Rees

    You can lead a horse to water, but a pencil must be lead.
    Stan Laurel

  • You mentioned an UPDATE query, yet table 3 contains no data (and therefore no amount of UPDATE queries will help). Are you sure that your test data is up to scratch?

    The absence of evidence is not evidence of absence.
    Martin Rees

    You can lead a horse to water, but a pencil must be lead.
    Stan Laurel

  • It would be helpful if you could show what results are expected.

    There is no data in tblData3 so I don't see how you can do an update?

  • Don't know how come I missed that. The BWAvg will be NULL when the data is inserted and will be updated later.

    insert into tblData3 Values ('4567','ABC',NULL)
    insert into tblData3 values ('3456','ABC',NULL)
    insert into tblData3 values ('3456','TMZ',NULL)
    insert into tblData3 values ('1358','PQR',NULL)
    insert into tblData3 values ('1358','XYZ',NULL)
    insert into tblData3 values ('1358','ABC',NULL)

     

  • The weighted average price is still the price.  Are you looking for average volumes?  Unique constraints on (SID, PID) to tables t2 and t3 are valid for your situation?  Assuming yes to the questions here's average volumes (copy, paste, run):

    drop table if exists #tblData1;
    go
    create table #tblData1
    (
    IDate date,
    PID varchar(20),
    SID varchar(20),
    TValue float
    );
    go

    insert into #tblData1 values ('10/15/2019','4567','ABC',4567.34)
    insert into #tblData1 values ('10/15/2019','4567','ABC',5678.34)
    insert into #tblData1 values ('10/15/2019','3456','ABC',3494.56)
    insert into #tblData1 values ('10/15/2019','3456','TMZ',2323.98)
    insert into #tblData1 values ('10/15/2019','3456','TMZ',234.78)
    insert into #tblData1 values ('10/15/2019','3456','TMZ',345.24)
    insert into #tblData1 values ('10/15/2019','1358','PQR',2896.24)
    insert into #tblData1 values ('10/15/2019','1358','PQR',2345.23)
    insert into #tblData1 values ('10/15/2019','1358','XYZ',2332.23)
    insert into #tblData1 values ('10/15/2019','1358','ABC',3333.33)

    drop table if exists #tblData2;
    go
    create table #tblData2
    (
    PID varchar(20),
    SID varchar(20),
    BPrice float,
    constraint unq_tblData2_pid_sid unique(PID, SID)
    );
    go

    insert into #tblData2 Values ('4567','ABC',103.24)
    insert into #tblData2 values ('3456','ABC',202.24)
    insert into #tblData2 values ('3456','TMZ',56.24)
    insert into #tblData2 values ('1358','PQR',50.25)
    insert into #tblData2 values ('1358','XYZ',235.24)
    insert into #tblData2 values ('1358','ABC',238.24)

    drop table if exists #tblData3;
    go
    create table #tblData3
    (
    PID varchar(20),
    SID varchar(20),
    BWAvg float,
    constraint unq_tblData3_pid_sid unique(PID, SID)
    );
    go

    insert into #tblData3 Values ('4567','ABC',NULL)
    insert into #tblData3 values ('3456','ABC',NULL)
    insert into #tblData3 values ('3456','TMZ',NULL)
    insert into #tblData3 values ('1358','PQR',NULL)
    insert into #tblData3 values ('1358','XYZ',NULL)
    insert into #tblData3 values ('1358','ABC',NULL)
    go

    with
    volumes_cte as (
    select
    t1.PID,
    T1.SID,
    T1.TValue,
    isnull(t1.TValue/T2.BPrice, 0) volume,
    t2.BPrice price
    from
    #tblData1 t1
    join
    #tblData2 t2 on t1.SID=t2.SID
    and t1.PID=t2.PID),
    avg_cte as (
    select
    PID,
    SID,
    avg(volume) avg_volume
    from
    volumes_cte
    group by
    PID,
    SID)
    update t3
    set
    BWAvg=ac.avg_volume
    from
    #tblData3 t3
    join
    avg_cte ac on t3.PID=ac.PID
    and t3.SID=ac.SID;

    select * from #tblData3;

     

     

     

    Aus dem Paradies, das Cantor uns geschaffen, soll uns niemand vertreiben können

  • SQL Server wrote:

    Don't know how come I missed that. The BWAvg will be NULL when the data is inserted and will be updated later.

    insert into tblData3 Values ('4567','ABC',NULL)
    insert into tblData3 values ('3456','ABC',NULL)
    insert into tblData3 values ('3456','TMZ',NULL)
    insert into tblData3 values ('1358','PQR',NULL)
    insert into tblData3 values ('1358','XYZ',NULL)
    insert into tblData3 values ('1358','ABC',NULL)

    So, for example, for

    PID = 4567
    SID = ABC
    TValues = 4567.34, 5678.34, 3494.56
    BPrice = 103.2

    What value would you expect BWAvg to be for the data above?

     

  • The two CTE's could be consolidated into one.

    with
    avg_cte as (
    select
    t1.PID,
    t1.SID,
    avg(isnull(t1.TValue/T2.BPrice, 0)) avg_volume
    from
    #tblData1 t1
    join
    #tblData2 t2 on t1.SID=t2.SID
    and t1.PID=t2.PID
    group by
    t1.PID,
    t1.SID)
    update t3
    set
    BWAvg=ac.avg_volume
    from
    #tblData3 t3
    join
    avg_cte ac on t3.PID=ac.PID
    and t3.SID=ac.SID;

    • This reply was modified 5 years, 1 month ago by  Steve Collins. Reason: fixed typo in code

    Aus dem Paradies, das Cantor uns geschaffen, soll uns niemand vertreiben können

Viewing 8 posts - 1 through 7 (of 7 total)

You must be logged in to reply to this topic. Login to reply