我在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查询有什么建议吗?
答案 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.这允许我们将摘要信息加入最新的详细信息行。