2016-03-07 87 views
0

共线我有连接在一起给我这个销售订单表头和明细文件:DB2 SQL - 新增订单数量和每个订单

Order_No Item 
99998  AA 
99998  AB 
99998  AC 
99998  AD 
99999  AA 
99999  AD 

有了这个SQL我可以显示每个订单总线路:

SELECT 
HDR_ORDERNO as OrderNo 
DET_ITEM 
    (SELECT COUNT(*) 
    FROM HEADER 
    WHERE HDR_ORDERNO = DET_ORDERNO) as Total_Lines 
FROM 
DETAIL LEFT JOIN HEADER 
ON (HRD_ORDER = DET_ORDER) 
ORDER BY 
HDR_ORDERNO, 

我想补充的行为LINE_NUMBER每个订单给我这个:

Order_No Line_Number Total_Lines Item 

99998 1    4   AA 
99998 2    4   AB 
99998 3    4   AC 
99998 4    4   AD 
99999 1    2   AA 
99999 2    2   AD 

我全光照摹IBM DB2/SQL,所以你看中的MS-SQL和Oracle语法不会在这里工作:(

回答

2

的ROW_NUMBER()OLAP功能是你的朋友...添加到DB2 IBM i的V5R4在...

with dtl_cnt as (select det_orderno 
         , count(*) as tot_lines 
       from detail 
       group by det_ordno) 
select 
hdr_orderno 
, row_number() over (partition by hdr_orderno) as Line_no 
, dc.tot_lines 
, d.item 
from 
    header 
    join dtl_count dc on hdr_orderno = dc.det_orderno 
    join detail d on hdr_orderno = d.det_orderno 
+1

语法错误,因为CTE没有“GROUP BY”来使用聚合函数。 –

+1

Gezz ...这就是我在睡觉前试图回答问题所得到的结果。答案是错过了FROM也是CTE。我已经添加了两个。 – Charles

+2

Gezz ...这就是我在睡觉前试图检查问题的答案。不能相信我错过了提到'FROM'。 –

0

我想出了类似的答案......除了子选择,我认为这是差不多..

SELECT  
    ORDER_HED.ORDER_NUM, 
    (SELECT COUNT(*)  
     FROM ORDER_DET 
     WHERE ORDER_HED.ORDER_NUM = ORDER_DET.DETAIL_NUM) as 
    LINE_COUNT, 
     ROW_NUMBER() 
     OVER (PARTITION BY DETAIL_NUM ORDER BY DETAIL_NUM ASC) as 
    ROW_NUMBER, 
    ORDER_DET.DETAIL_SKU, 
    ORDER_DET.DETAIL_QTY, ORDER_DET.DETAIL_PRICE 
FROM ORDER_HED JOIN ORDER_DET 
ON(ORDER_HED.ORDER_NUM = ORDER_DET.DETAIL_NUM) 

注意,字段名是有点不同。

+1

与此有关的一个问题是子选择可能正在针对每一行运行,这可能是性能问题。做它作为一个CTE将会让它运行一次。噢,由同一列进行分区和排序不会产生任何影响:每次分区更改时,ROW_NUMBER都会重新启动,因此每个不同的DETAIL_NUM从1开始。 –