2011-07-26 2 views
1

Ci-dessous la requête que j'ai créée pour obtenir certains numéros d'article, quantité commandée et prix et autres de la base de données. Le problème est que parfois une commande ne contient pas 20 numéros d'articles mais seulement 2. Maintenant, ma question est de savoir s'il est possible de remplir les espaces avec d'autres numéros d'articles au hasard de la base de données. Il n'a pas besoin d'être correct car c'est juste pour tester.Aide à la requête SQL pour générer des données

Alors quelqu'un peut-il aider?

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 
; 

Répondre

0

Sans être en mesure de tester vraiment, vous pouvez essayer quelque chose comme ça. Remplacez la vue en ligne « x » avec ceci:

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 

La clause vous donnera une table avec 20 lignes de données aléatoires. Outer joindre cela avec vos anciennes données «x» et vous serez garanti 20 lignes de données. Vous n'aurez peut-être pas besoin de diffuser l'élément en tant que varchar2 en fonction des données. (N.B., j'ai finalement trouvé une requête qu'il est logique d'utiliser un droit rejoindre avec Voir this SO question)

Je ne suis pas sûr de ce que vous essayez de faire avec les choses GROUP BY et MAX? À l'avenir, il serait utile de condenser vos exemples en quelque chose que d'autres peuvent facilement tester, un cas minime qui fait passer votre message.

J'ai également incorporé @ la bonne suggestion de Kevin pour utiliser ROW_NUMBER au lieu de RANK.

0

très difficile à comprendre ...

Je pense que vous pourriez être ok si vous mettez un 0 au lieu de zéro dans les valeurs de prix ...

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

et

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

alors au moins le calcul devrait fonctionner.