Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于同一表中的列生成Oracle序列_Sql_Oracle_Sequence - Fatal编程技术网

Sql 基于同一表中的列生成Oracle序列

Sql 基于同一表中的列生成Oracle序列,sql,oracle,sequence,Sql,Oracle,Sequence,我正在尝试使用oracle中的分析函数生成序列。但是,我的序列依赖于表PROD_INFO中的两列。列名为PROD_ID和BILLING_NO。对于同一PROD_ID,可以有多个BILLING_NO。BILLING_NO也可以有空值。我需要根据以下逻辑生成序列 对于第一组PROD_ID,BILLING_NO composition,我需要增加2000、2010、2020等序列,直到找到具有相同PROD_ID的不同BILLING_NO 如果是不同的账单号,我需要输入3000、3010、3020等序列

我正在尝试使用oracle中的分析函数生成序列。但是,我的序列依赖于表PROD_INFO中的两列。列名为PROD_ID和BILLING_NO。对于同一PROD_ID,可以有多个BILLING_NO。BILLING_NO也可以有空值。我需要根据以下逻辑生成序列

  • 对于第一组PROD_ID,BILLING_NO composition,我需要增加2000、2010、2020等序列,直到找到具有相同PROD_ID的不同BILLING_NO
  • 如果是不同的账单号,我需要输入3000、3010、3020等序列
  • 当产品ID更改时,我需要将该账单编号的顺序更改为2000、2010、2020等。输出显示在下表中
  • 附言:我在上面的输出中用“NULL”描述了NULL值

    我目前正在使用下面的分析函数。但是,它不会更改为3000、3010等、4000、4010等,而是重复2000、2010、2020等

    SELECT   PROD_ID,
        BILLING_NO,
        2000 + ROW_NUMBER() OVER (PARTITION BY PROD_ID, BILLING_NO ORDER BY BILLING_NO) * 10 AS SEQUENCE,
        QUANTITY
    FROM    PROD_INFO;
    
    所以,你能帮我实现上述结果吗

    谢谢大家!

    --The query you need
    SELECT PROD_ID,
      BILLING_NO,
      (DENSE_RANK() OVER (PARTITION BY prod_id ORDER BY PROD_ID, BILLING_NO) + 1) * 1000 
      + 
      ROW_NUMBER() OVER (PARTITION BY PROD_ID, BILLING_NO ORDER BY BILLING_NO) * 10 AS sequence,
      QUANTITY
    FROM PROD_INFO
    /
    
    您需要使用
    ANALYTIC
    函数
    densite\u RANK
    ROW\u NUMBER

    让我们用一个测试用例来检查这一点

    SQL> WITH DATA AS(
      2  SELECT '1-7OR'  PROD_ID,   'AB1'    BILLING_NO FROM DUAL UNION ALL
      3  SELECT '1-7OR'  PROD_ID,   'AB1'        BILLING_NO FROM DUAL UNION ALL
      4  SELECT '1-7OR'  PROD_ID,   'AB1'      BILLING_NO FROM DUAL UNION ALL
      5  SELECT '1-7OR'  PROD_ID,   NULL       BILLING_NO FROM DUAL UNION ALL
      6  SELECT '1-7OR'  PROD_ID,   'AB2'       BILLING_NO FROM DUAL UNION ALL
      7  SELECT '1-7OR'  PROD_ID,   'AB2'        BILLING_NO FROM DUAL UNION ALL
      8  SELECT '1-7OR'  PROD_ID,   'AB2'         BILLING_NO FROM DUAL UNION ALL
      9  SELECT '1-7OR'  PROD_ID,   'AB2'         BILLING_NO FROM DUAL UNION ALL
     10  SELECT '1-7OR'  PROD_ID,   NULL        BILLING_NO FROM DUAL UNION ALL
     11  SELECT '1-7OR'  PROD_ID,   NULL       BILLING_NO FROM DUAL UNION ALL
     12  SELECT '1-7OR'  PROD_ID,   'AB3'         BILLING_NO FROM DUAL UNION ALL
     13  SELECT '1-7OR'  PROD_ID,   'AB3'        BILLING_NO FROM DUAL UNION ALL
     14  SELECT '1-7OR'  PROD_ID,   'AB3'         BILLING_NO FROM DUAL UNION ALL
     15  SELECT '1-9ER'  PROD_ID,   'UC1'         BILLING_NO FROM DUAL UNION ALL
     16  SELECT '1-9ER'  PROD_ID,   'UC1'        BILLING_NO FROM DUAL UNION ALL
     17  SELECT '1-9ER'  PROD_ID,   'UC1'        BILLING_NO FROM DUAL UNION ALL
     18  SELECT '1-9ER'  PROD_ID,   'UC1'        BILLING_NO FROM DUAL UNION ALL
     19  SELECT '1-9ER'  PROD_ID,   NULL       BILLING_NO FROM DUAL UNION ALL
     20  SELECT '1-9ER'  PROD_ID,   'UC2'      BILLING_NO FROM DUAL UNION ALL
     21  SELECT '1-9ER'  PROD_ID,   'UC2'      BILLING_NO FROM DUAL UNION ALL
     22  SELECT '1-9ER'  PROD_ID,   'UC2'        BILLING_NO FROM DUAL UNION ALL
     23  SELECT '1-9ER'  PROD_ID,   'UC2'         BILLING_NO FROM DUAL
     24  )
     25  --The query you need
     26  SELECT PROD_ID,
     27    BILLING_NO,
     28    (DENSE_RANK() OVER (PARTITION BY prod_id ORDER BY PROD_ID, BILLING_NO) + 1) * 1000
     29    +
     30    ROW_NUMBER() OVER (PARTITION BY PROD_ID, BILLING_NO ORDER BY BILLING_NO) * 10 AS sequence
     31  FROM data
     32  /
    
    PROD_ BIL             SEQUENCE
    ----- --- --------------------
    1-7OR AB1                 2010
    1-7OR AB1                 2020
    1-7OR AB1                 2030
    1-7OR AB2                 3010
    1-7OR AB2                 3020
    1-7OR AB2                 3030
    1-7OR AB2                 3040
    1-7OR AB3                 4010
    1-7OR AB3                 4020
    1-7OR AB3                 4030
    1-7OR                     5010
    1-7OR                     5020
    1-7OR                     5030
    1-9ER UC1                 2010
    1-9ER UC1                 2020
    1-9ER UC1                 2030
    1-9ER UC1                 2040
    1-9ER UC2                 3010
    1-9ER UC2                 3020
    1-9ER UC2                 3030
    1-9ER UC2                 3040
    1-9ER                     4010
    
    22 rows selected.
    
    SQL>
    

    注意窗口功能将所有空值保持在一起。

    问得好。您需要使用
    analytic
    函数
    densite\u rank
    row\u number
    。检查我的答案。太棒了,谢谢!我只是稍微调整了一下你的答案,从2000年开始。选择产品标识,账单号,(密集等级()覆盖(按产品标识按订单划分,账单号)+1)*1000+(行号()覆盖(按产品标识划分,按账单号划分)*10)-10作为序列,数量来自产品信息;啊,是的,我没有意识到我的解决方案的顺序是从
    2010
    开始,而不是从
    2000
    开始。感谢您的反馈:-)
    SQL> WITH DATA AS(
      2  SELECT '1-7OR'  PROD_ID,   'AB1'    BILLING_NO FROM DUAL UNION ALL
      3  SELECT '1-7OR'  PROD_ID,   'AB1'        BILLING_NO FROM DUAL UNION ALL
      4  SELECT '1-7OR'  PROD_ID,   'AB1'      BILLING_NO FROM DUAL UNION ALL
      5  SELECT '1-7OR'  PROD_ID,   NULL       BILLING_NO FROM DUAL UNION ALL
      6  SELECT '1-7OR'  PROD_ID,   'AB2'       BILLING_NO FROM DUAL UNION ALL
      7  SELECT '1-7OR'  PROD_ID,   'AB2'        BILLING_NO FROM DUAL UNION ALL
      8  SELECT '1-7OR'  PROD_ID,   'AB2'         BILLING_NO FROM DUAL UNION ALL
      9  SELECT '1-7OR'  PROD_ID,   'AB2'         BILLING_NO FROM DUAL UNION ALL
     10  SELECT '1-7OR'  PROD_ID,   NULL        BILLING_NO FROM DUAL UNION ALL
     11  SELECT '1-7OR'  PROD_ID,   NULL       BILLING_NO FROM DUAL UNION ALL
     12  SELECT '1-7OR'  PROD_ID,   'AB3'         BILLING_NO FROM DUAL UNION ALL
     13  SELECT '1-7OR'  PROD_ID,   'AB3'        BILLING_NO FROM DUAL UNION ALL
     14  SELECT '1-7OR'  PROD_ID,   'AB3'         BILLING_NO FROM DUAL UNION ALL
     15  SELECT '1-9ER'  PROD_ID,   'UC1'         BILLING_NO FROM DUAL UNION ALL
     16  SELECT '1-9ER'  PROD_ID,   'UC1'        BILLING_NO FROM DUAL UNION ALL
     17  SELECT '1-9ER'  PROD_ID,   'UC1'        BILLING_NO FROM DUAL UNION ALL
     18  SELECT '1-9ER'  PROD_ID,   'UC1'        BILLING_NO FROM DUAL UNION ALL
     19  SELECT '1-9ER'  PROD_ID,   NULL       BILLING_NO FROM DUAL UNION ALL
     20  SELECT '1-9ER'  PROD_ID,   'UC2'      BILLING_NO FROM DUAL UNION ALL
     21  SELECT '1-9ER'  PROD_ID,   'UC2'      BILLING_NO FROM DUAL UNION ALL
     22  SELECT '1-9ER'  PROD_ID,   'UC2'        BILLING_NO FROM DUAL UNION ALL
     23  SELECT '1-9ER'  PROD_ID,   'UC2'         BILLING_NO FROM DUAL
     24  )
     25  --The query you need
     26  SELECT PROD_ID,
     27    BILLING_NO,
     28    (DENSE_RANK() OVER (PARTITION BY prod_id ORDER BY PROD_ID, BILLING_NO) + 1) * 1000
     29    +
     30    ROW_NUMBER() OVER (PARTITION BY PROD_ID, BILLING_NO ORDER BY BILLING_NO) * 10 AS sequence
     31  FROM data
     32  /
    
    PROD_ BIL             SEQUENCE
    ----- --- --------------------
    1-7OR AB1                 2010
    1-7OR AB1                 2020
    1-7OR AB1                 2030
    1-7OR AB2                 3010
    1-7OR AB2                 3020
    1-7OR AB2                 3030
    1-7OR AB2                 3040
    1-7OR AB3                 4010
    1-7OR AB3                 4020
    1-7OR AB3                 4030
    1-7OR                     5010
    1-7OR                     5020
    1-7OR                     5030
    1-9ER UC1                 2010
    1-9ER UC1                 2020
    1-9ER UC1                 2030
    1-9ER UC1                 2040
    1-9ER UC2                 3010
    1-9ER UC2                 3020
    1-9ER UC2                 3030
    1-9ER UC2                 3040
    1-9ER                     4010
    
    22 rows selected.
    
    SQL>