代码之家  ›  专栏  ›  技术社区  ›  as - if

按分区划分的SQL多重和

  •  -1
  • as - if  · 技术社区  · 6 年前

    我有下面的postgreSql表 stock ,结构如下

    | column |  pk |
    +--------+-----+
    | date   | yes |
    | id     | yes |
    | type   | yes |
    | qty    |     |
    | fee    |     |
    

    桌子看起来像这样

    |    date    |  id | type | qty  | fee |
    +------------+-----+------+------+------+
    | 2015-01-01 | 001 | CB04 |  500 |    2 |
    | 2015-01-01 | 002 | CB04 | 1500 |    3 |
    | 2015-01-01 | 003 | CB04 |  500 |    1 |
    | 2015-01-01 | 004 | CB04 |  100 |    5 |
    | 2015-01-01 | 001 | CB02 |  800 |    6 |
    | 2015-01-02 | 002 | CB03 | 3100 |    1 |
    |            |     |      |      |      |
    

    我想创建一个视图或查询,以便结果如下所示。

    |    date    | type | t_qty | total_weighted_fee |
    +------------+------+-------+--------------------+
    | 2015-01-01 | CB04 |  2600 |                2.5 |
    | 2015-01-01 | CB03 |  3100 |                  1 |
    |            |      |       |                    |
    

    我所做的就是

    http://sqlfiddle.com/#!17/39fb8a/18

    但这不是我想要的结果。

    这个 子查询 桌子看起来像这样:

    % of total Qty = qty / t_qty

    weighted fee = fee * %总数量的

    |    date    |  id | type | qty  | fee | t_qty | % of total Qty | weighted fee |
    +------------+-----+------+------+-----+-------+----------------+--------------+
    | 2015-01-01 | 001 | CB04 |  500 |   2 |  2600 |           0.19 |         0.38 |
    | 2015-01-01 | 002 | CB04 | 1500 |   3 |  2600 |           0.58 |         1.73 |
    | 2015-01-01 | 003 | CB04 |  500 |   1 |  2600 |           0.19 |        0.192 |
    | 2015-01-01 | 004 | CB04 |  100 |   5 |  2600 |           0.04 |        0.192 |
    | 2015-01-01 | 002 | CB03 | 3100 |   1 |  3100 |              1 |            1 |
    |            |     |      |      |     |       |                |              |
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Gordon Linoff    6 年前

    您可以使用聚合。. . 我觉得你离得不远:

    select date, type, sum(qty),
           sum(fee * qty * 1.0) / nullif(sum(qty), 0)
    from t
    group by date, type;