左连接复合与第一行其他选择

时间:2013-10-23 09:54:22

标签: sql db2 iseries-navigator

我在Iseries上有一个针对DB2数据库的复杂SQL查询。 我简化了我的方案以获得任何帮助。

2013年10月23日更新10:54 PM:

好的,我的Explane解释了我的问题......想象一下,你有一个名为“Products”的TABLE 包含客户代码的所有变动金额...例如:

**Product** table


CUSTOMER_CODE | PRODUCT_CODE | DATE_MOVEMENT | QTA_MOVEMENT | AMOUNT
______________________________________________________________________
 C0001        | BOOK         | 20133101      | 400          | 60
 C0001        | BOOK         | 20131231      | 40           | 30
 C0001        | BOOK         | 20130701      | 1            | 6
 C0001        | BOOK         | 20130310      | 4            | 15
 C0002        | BOOK2        | 20131210      | 4            | 15
 C0002        | BOOK2        | 20131110      | 4            | 18
 C0002        | BOOK2        | 20131230      | 42           | 130
 C0002        | BOOK2        | 20130610      | 42           | 140

我需要创建一个SQL QUERY,它为任何一个QTA_MOVEMENT和AMOUNT COLUMN的任何客户的PRODUCT_CODE提供一个SUM .... 并同时打印任何行的最后QTA_MOVEMENT,最后一天,最后一天的运动(customer_code + product_code + years)。 结果查询是这样的:

**Product** table

C_CODE | PRODUCT_CODE | YEAR | T_QTA | T_AMOUNT | L_DATE  | L_QTA_MOV | L_AMOUNT|
_________________________________________________________________________________
C0001  | BOOK         | 2013 | 445   | 111      |20131231 | 40        | 30
C0002  | BOOK2        | 2013 | 92    | 303      |20131230 | 42        | 130

我用这个例子简化了我的问题......

您对我需要的SQL查询有什么建议吗?

2 个答案:

答案 0 :(得分:0)

说实话,你的疑问搞砸了。仅通过查看您的查询很难找出您的实际目标。

首先,我会尽量避免创建临时表。为什么不能将表直接放在from语句中而不是(select ... from ... where) as table_alias?我不是100%肯定,但我希望查询优化器无法优化这些语句。

在您的查询中,您使用LASTM加入TOT。但是,您需要TOT在LASTM中创建1行。为什么不早点加入LASTM?当你解释你想要做什么时会有所帮助,所以有人可以帮你重写查询。

最后一点。我看到你正在加入同一个表(TABLEORIG)。这让人怀疑桌子设计不是很有帮助。不知道您是否可以选择更改表格设计。

答案 1 :(得分:0)

我不确定看到前几年的最后一笔交易是多么有用。但是自从编辑你的问题以后,你似乎要求这样的事情:

  with hst as
  ( select customer_code                     as customer
         , product_code                      as product
         , cast(year(date_sold) as num(4,0)) as yr
         , date_sold
         , quantity_sold                     as qty
         , sales_amount                      as amt
         , int(row_number() over
                (partition by customer_code, product_code, year(date_sold)
                 order by date_sold desc
              ) )                            as recent
      from sales_history
  ), tot as
  ( select customer, product, yr
         , sum(qty)   as t_qty
         , sum(amt)   as t_amt
     from hst
     group by customer, product, yr
  )
  select t.*
       , h.date_sold  as l_date
       , h.qty        as l_qty
       , h.amt        as l_amt
    from tot t
    join hst h    on  h.customer = t.customer
                  and h.product  = t.product
                  and h.yr       = t.yr
                  and h.recent   = 1
    order by customer, product, yr;

row_number()函数将根据每个分区组中的降序销售日期分配序列号。该组中的最新信息将是序列1.这允许我们将摘要信息加入最新的详细信息行。