0

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

2013 年 10 月 23 日晚上 10:54 更新:

好的,我 Explane 解释了我的问题...假设您有一个名为“Products”的表,其中包含客户代码的所有移动以及金额...例如:

**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 的任何客户的任何 PRODUCT_CODE 和 AMOUNT COLUMN 的总和......并同时打印任何行的 LAST QTA_MOVEMENT、LAST AMOUNT、LAST DATE MOVEMENT(customer_code + product_code + 年)。结果查询是这样的:

**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 查询有什么建议吗?

4

2 回答 2

0

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

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

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

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

于 2013-10-23T18:32:55.317 回答
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。这允许我们将摘要信息连接到最新的详细信息行。

于 2013-11-07T02:32:54.463 回答