【问题标题】:DB2 SQL - add order line number and total lines per orderDB2 SQL - 添加订单行号和每个订单的总行数
【发布时间】:2016-03-07 00:00:17
【问题描述】:

我有一个销售订单标题和详细信息文件,它们结合在一起得到了这个:

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 语法在这里不起作用:(

【问题讨论】:

    标签: sql join db2 db2-400


    【解决方案1】:

    ROW_NUMBER() OLAP 函数是您的朋友...在 v5r4 中添加到 DB2 for IBM i...

    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
    

    【讨论】:

    • 语法错误,因为 CTE 没有 GROUP BY 与聚合函数一起使用。
    • Gezz...这就是我试图在睡前回答问题所得到的。答案是缺少 FROM 也是 CTE。我都添加了。
    • Gezz...这就是我试图在睡前检查问题的答案所得到的。不敢相信我错过了提到FROM
    【解决方案2】:

    我想出了类似的答案...除了子选择之外,我认为它大致相同..

    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) 
    

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

    【讨论】:

    • 这样做的一个问题是子选择可能正在为每一行运行,这可能是一个性能问题。将其作为 CTE 将使其运行一次。哦,按同一列进行分区和排序将不起作用:ROW_NUMBER 每次分区更改时都会重新启动,因此每个不同的DETAIL_NUM 无论如何都从 1 开始。
    猜你喜欢
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    相关资源
    最近更新 更多