Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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查询有助于生成数据_Sql_Oracle - Fatal编程技术网

SQL查询有助于生成数据

SQL查询有助于生成数据,sql,oracle,Sql,Oracle,下面是我创建的用于从数据库中获取某些ItemNumber、订购数量和价格等信息的查询。问题是,有时一个订单不包含20个ItemsNumber,而只包含2个。现在我的问题是,是否可以用数据库中的其他随机项号填充空格。它不需要是正确的,因为它只是用于测试 有人能帮忙吗 select t.*, -- THE THREE SUMVAT VALUES BELOW ARE VERY IMPORTANT. THEY ARE ONLY CORRECT HOWEVER WHEN THERE ARE

下面是我创建的用于从数据库中获取某些ItemNumber、订购数量和价格等信息的查询。问题是,有时一个订单不包含20个ItemsNumber,而只包含2个。现在我的问题是,是否可以用数据库中的其他随机项号填充空格。它不需要是正确的,因为它只是用于测试

有人能帮忙吗

select   
  t.*, 
  -- THE THREE SUMVAT VALUES BELOW ARE VERY IMPORTANT. THEY ARE ONLY CORRECT HOWEVER WHEN THERE ARE NO NULL VALUES INVOLVED IN THE MATH,
  -- I.E. WHEN THERE ARE 20 ITEMS/QTYS/PRICES INVOLVED WITH A CERTAIN ORDER_NO
  ((t.QTY1*t.PRICE1)+(t.QTY2*t.PRICE2)+(t.QTY3*t.PRICE3)+(t.QTY4*t.PRICE4)+(t.QTY5*t.PRICE5))           SUMVAT0,    -- example: 5123.45   <- lines 1-5: Q*P
  ((t.QTY6*t.PRICE6)+(t.QTY7*t.PRICE7)+(t.QTY8*t.PRICE8)+(t.QTY9*t.PRICE9)+(t.QTY10*t.PRICE10)+(t.QTY11*t.PRICE11)+(t.QTY12*t.PRICE12)+(t.QTY13*t.PRICE13)+(t.QTY14*t.PRICE14)+(t.QTY15*t.PRICE15)) 
                                                                                                        SUMVAT6,    -- example: 1234.56   <- lines 6-15: Q*P
  ((t.QTY16*t.PRICE16)+(t.QTY17*t.PRICE17)+(t.QTY18*t.PRICE18)+(t.QTY19*t.PRICE19)+(t.QTY20*t.PRICE20)) SUMVAT19    -- example: 4567.89   <- lines 16-20: Q*P
from (
  select 
    (to_char(p.vdate, 'YYYYMMDD') || to_char(sysdate, 'HH24MISS')) DT,
    (to_char(p.vdate, 'YYYY-MM-DD') ||'T' || to_char(sysdate, 'HH24:MI:') || '00') DATETIME,
    (to_char(orh.written_date, 'YYYY-MM-DD') ||'T00:00:00') DATETIME2,
    orh.supplier FAKE_GLN,
    y.*
  from (
    select 
      x.order_no ORDNO

      , max(decode(r,1 ,x.item,null)) FAKE_GTIN1
      , max(decode(r,2 ,x.item,null)) FAKE_GTIN2
      , max(decode(r,3 ,x.item,null)) FAKE_GTIN3
      , max(decode(r,4 ,x.item,null)) FAKE_GTIN4
      , max(decode(r,5 ,x.item,null)) FAKE_GTIN5
      , max(decode(r,6 ,x.item,null)) FAKE_GTIN6
      , max(decode(r,7 ,x.item,null)) FAKE_GTIN7
      , max(decode(r,8 ,x.item,null)) FAKE_GTIN8
      , max(decode(r,9 ,x.item,null)) FAKE_GTIN9
      , max(decode(r,10,x.item,null)) FAKE_GTIN10
      , max(decode(r,11,x.item,null)) FAKE_GTIN11
      , max(decode(r,12,x.item,null)) FAKE_GTIN12
      , max(decode(r,13,x.item,null)) FAKE_GTIN13
      , max(decode(r,14,x.item,null)) FAKE_GTIN14
      , max(decode(r,15,x.item,null)) FAKE_GTIN15
      , max(decode(r,16,x.item,null)) FAKE_GTIN16
      , max(decode(r,17,x.item,null)) FAKE_GTIN17
      , max(decode(r,18,x.item,null)) FAKE_GTIN18
      , max(decode(r,19,x.item,null)) FAKE_GTIN19
      , max(decode(r,20,x.item,null)) FAKE_GTIN20

      , max(decode(r,1 ,x.qty_ordered,null)) QTY1
      , max(decode(r,2 ,x.qty_ordered,null)) QTY2
      , max(decode(r,3 ,x.qty_ordered,null)) QTY3
      , max(decode(r,4 ,x.qty_ordered,null)) QTY4
      , max(decode(r,5 ,x.qty_ordered,null)) QTY5
      , max(decode(r,6 ,x.qty_ordered,null)) QTY6
      , max(decode(r,7 ,x.qty_ordered,null)) QTY7
      , max(decode(r,8 ,x.qty_ordered,null)) QTY8
      , max(decode(r,9 ,x.qty_ordered,null)) QTY9
      , max(decode(r,10,x.qty_ordered,null)) QTY10
      , max(decode(r,11,x.qty_ordered,null)) QTY11
      , max(decode(r,12,x.qty_ordered,null)) QTY12
      , max(decode(r,13,x.qty_ordered,null)) QTY13
      , max(decode(r,14,x.qty_ordered,null)) QTY14
      , max(decode(r,15,x.qty_ordered,null)) QTY15
      , max(decode(r,16,x.qty_ordered,null)) QTY16
      , max(decode(r,17,x.qty_ordered,null)) QTY17
      , max(decode(r,18,x.qty_ordered,null)) QTY18
      , max(decode(r,19,x.qty_ordered,null)) QTY19
      , max(decode(r,20,x.qty_ordered,null)) QTY20

      , max(decode(r,1 ,x.unit_cost,null)) PRICE1
      , max(decode(r,2 ,x.unit_cost,null)) PRICE2
      , max(decode(r,3 ,x.unit_cost,null)) PRICE3
      , max(decode(r,4 ,x.unit_cost,null)) PRICE4
      , max(decode(r,5 ,x.unit_cost,null)) PRICE5
      , max(decode(r,6 ,x.unit_cost,null)) PRICE6
      , max(decode(r,7 ,x.unit_cost,null)) PRICE7
      , max(decode(r,8 ,x.unit_cost,null)) PRICE8
      , max(decode(r,9 ,x.unit_cost,null)) PRICE9
      , max(decode(r,10,x.unit_cost,null)) PRICE10
      , max(decode(r,11,x.unit_cost,null)) PRICE11
      , max(decode(r,12,x.unit_cost,null)) PRICE12
      , max(decode(r,13,x.unit_cost,null)) PRICE13
      , max(decode(r,14,x.unit_cost,null)) PRICE14
      , max(decode(r,15,x.unit_cost,null)) PRICE15
      , max(decode(r,16,x.unit_cost,null)) PRICE16
      , max(decode(r,17,x.unit_cost,null)) PRICE17
      , max(decode(r,18,x.unit_cost,null)) PRICE18
      , max(decode(r,19,x.unit_cost,null)) PRICE19
      , max(decode(r,20,x.unit_cost,null)) PRICE20
    from (
      select 
        rank() over (partition by oh.order_no order by ol.item asc) r,
        oh.supplier,
        oh.order_no,
        oh.written_date,
        ol.item,
        ol.qty_ordered,
        ol.unit_cost
      from 
        ordhead oh
        JOIN ordloc ol ON oh.order_no = ol.order_no
      where 
--        count(numrows) = 1500
        not unit_cost is null
--        and ol.order_no in (6181,6121)
    ) x 
    group by x.order_no
  ) y
  JOIN ordhead orh ON orh.order_no = y.ORDNO,
  period p
) t
;

很难理解

我想如果你在价格值中用0而不是null,你可能就可以了

 , max(decode(r,18,x.unit_cost,0)) PRICE18

那么至少数学应该是可行的。

排名不能保证组中项目的顺序计数,当您有多行具有相同的值时,可能会有间隙

有关合理的解释,请参见:


我认为您需要使用row_number

而不能真正测试它,您可以尝试这样的方法。将内联视图“x”替换为以下内容:

FROM (
  WITH q AS (
   SELECT LEVEL  r, TO_CHAR(TRUNC(dbms_random.value*1000,0)) item
                  , TRUNC(dbms_random.value*100,0) qty_ordered
                  , TRUNC(dbms_random.value*10,2) unit_cost
     FROM dual CONNECT BY LEVEL <= 20
  )
   SELECT COALESCE(x1.r, q.r) r, supplier, order_no, written_date
        , COALESCE(x1.item, q.item) item
        , COALESCE(x1.qty_ordered, q.qty_ordered) qty_ordered
        , COALESCE(x1.unit_cost, q.unit_cost) unit_cost
    FROM (SELECT ROW_NUMBER() OVER (PARTITION BY oh.order_no ORDER BY ol.item ASC) r
               , oh.supplier
               , oh.order_no
               , oh.written_date
               , ol.item
               , ol.qty_ordered
               , ol.unit_cost
            FROM ordhead oh JOIN ordloc ol ON oh.order_no = ol.order_no
           WHERE NOT unit_cost IS NULL) x1 RIGHT JOIN q ON x1.r = q.r
) x 
GROUP BY x.order_no
WITH子句将为您提供一个包含20行随机数据的表。将它与旧的“x”数据连接起来,您将保证有20行数据。根据数据,您可能不需要将该项强制转换为varchar2。注意,我终于找到了一个使用右连接的查询。看

我不太清楚你想用GROUP BY和MAX的东西做什么?在将来,将你的例子浓缩成其他人可以轻松测试的东西会很有帮助,这是一个能让你的观点得到理解的最小案例

我还采纳了@Kevin的好建议,即使用行数而不是排名

FROM (
  WITH q AS (
   SELECT LEVEL  r, TO_CHAR(TRUNC(dbms_random.value*1000,0)) item
                  , TRUNC(dbms_random.value*100,0) qty_ordered
                  , TRUNC(dbms_random.value*10,2) unit_cost
     FROM dual CONNECT BY LEVEL <= 20
  )
   SELECT COALESCE(x1.r, q.r) r, supplier, order_no, written_date
        , COALESCE(x1.item, q.item) item
        , COALESCE(x1.qty_ordered, q.qty_ordered) qty_ordered
        , COALESCE(x1.unit_cost, q.unit_cost) unit_cost
    FROM (SELECT ROW_NUMBER() OVER (PARTITION BY oh.order_no ORDER BY ol.item ASC) r
               , oh.supplier
               , oh.order_no
               , oh.written_date
               , ol.item
               , ol.qty_ordered
               , ol.unit_cost
            FROM ordhead oh JOIN ordloc ol ON oh.order_no = ol.order_no
           WHERE NOT unit_cost IS NULL) x1 RIGHT JOIN q ON x1.r = q.r
) x 
GROUP BY x.order_no