SQL查询有助于生成数据

时间:2011-07-26 13:11:54

标签: sql oracle

我创建的查询下面是为了从数据库中获取某些项目编号,数量订购和价格等。问题是,有时订单不包含20个项目,但只有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
;

3 个答案:

答案 0 :(得分:0)

很难理解......

我认为如果你在价格值中加上0而不是null,你可能会没事......

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

 , max(decode(r,20,x.qty_ordered,0)) QTY20

然后至少数学应该有效。

答案 1 :(得分:0)

Rank无法保证组中项目的顺序计数,当您有多个具有相同值的行时,可能会出现间隙。

要获得合理的解释,请参阅:

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2920665938600

我认为您需要使用row_number

答案 2 :(得分:0)

如果不能真正测试这个,你可能会尝试这样的事情。用以下内容替换内联视图'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。 (N.B.,我终于找到了一个查询,认为使用RIGHT JOIN是有意义的。见this SO question

我不太确定你想用GROUP BY和MAX做什么?在将来,将您的示例压缩到其他人可以轻松测试的内容中会很有帮助,这是一个可以帮助您了解问题的最小案例。

我还将@ Kevin的好建议纳入使用ROW_NUMBER而不是RANK。