sql >> Database teknologi >  >> RDS >> Oracle

Oprettelse af JSON og redigering af en kompleks forespørgsel (oracle 11g)

Jeg tror, ​​du kan erstatte det meste af din kode med følgende forespørgsel. Du skal muligvis justere IN-klausulen, hvilket er en smerte, hvis du ændrer meget på kundelisten. Men dette replikerer dine resultater:

SELECT * FROM (SELECT DECODE(ppc.customer_class_code, 'E', c.description, ppc.customer_class_code) AS IDENTIFIER, tpp.item_code, tpp.price AS ITEM_PRICE, ppc.price FROM table_price_list tpl INNER JOIN table_price_product tpp ON tpp.list_header_id = tpl.list_header_id AND tpp.request_id = tpl.request_id INNER JOIN prices_per_client ppc ON tpp.item_code = ppc.item_code LEFT JOIN clients c ON ppc.customer_number = c.account_number WHERE SYSDATE BETWEEN NVL(tpp.start_date_active, SYSDATE) AND NVL(tpp.end_date_active, SYSDATE+1)) PIVOT (AVG(PRICE) FOR IDENTIFIER IN ('A' AS CLASS_A , 'B' AS CLASS_B, 'SUPERMARKET' AS SUPERMARKET, 'WALMART' AS WALMART));

Her er en opdatering violin .

Med hensyn til JSON-output, ville det være meget nemmere, hvis du var på en nyere version, da det nu er en del af kernefunktionaliteten.

EDIT:Tilføjelse af XML-funktionalitet pr. kommentarer

Du kan tjekke denne forespørgsel:

SELECT XMLSERIALIZE(CONTENT XMLELEMENT("Item", XMLATTRIBUTES(sub.item_code AS "SKU", sub.item_price AS "Price"), XMLELEMENT("PRICES_FOR_CLIENTS", XMLAGG(XMLELEMENT("CLIENT_PRICE", XMLFOREST(sub.identifier AS "Client", sub.price AS "Price"))))) AS CLOB INDENT) FROM (SELECT DECODE(ppc.customer_class_code, 'E', c.description, ppc.customer_class_code) AS IDENTIFIER, tpp.item_code, tpp.price AS ITEM_PRICE, avg(ppc.price) AS PRICE FROM table_price_list tpl INNER JOIN table_price_product tpp ON tpp.list_header_id = tpl.list_header_id AND tpp.request_id = tpl.request_id INNER JOIN prices_per_client ppc ON tpp.item_code = ppc.item_code LEFT JOIN clients c ON ppc.customer_number = c.account_number WHERE SYSDATE BETWEEN NVL(tpp.start_date_active, SYSDATE) AND NVL(tpp.end_date_active, SYSDATE+1) GROUP BY DECODE(ppc.customer_class_code, 'E', c.description, ppc.customer_class_code), tpp.item_code, tpp.price) sub WHERE sub.identifier IS NOT NULL GROUP BY sub.item_code, sub.item_price;

Her er en opdateret violin med den forespørgsel (Link ).

Hvilket producerer følgende output:

<Item SKU="99342435" Price="9999">
    <PRICES_FOR_CLIENTS>
        <CLIENT_PRICE>
            <Client>WALMART</Client>
            <Price>40340</Price>
        </CLIENT_PRICE>
        <CLIENT_PRICE>
            <Client>SUPERMARKET</Client>
            <Price>48343</Price>
        </CLIENT_PRICE>
        <CLIENT_PRICE>
            <Client>B</Client>
            <Price>33223</Price>
        </CLIENT_PRICE>
        <CLIENT_PRICE>
            <Client>A</Client>
            <Price>29223</Price>
        </CLIENT_PRICE>
    </PRICES_FOR_CLIENTS>
</Item>
 

Redigering 2:Tilføjelse af JSON via strengkonkatinering

Følgende vil udsende JSON via direkte strengkonkatinering:

SELECT '{"sku":"'||sub.item_code||'","PRICE":"'||sub.item_price||'",PRICES_FOR_CLIENTS:['||listagg('{"group":"'||sub.identifier||'","PRICE":"'||sub.price||'"}',',') WITHIN GROUP (ORDER BY sub.identifier)||']};' AS JSON                                              
FROM (SELECT DECODE(ppc.customer_class_code, 'E', c.description, ppc.customer_class_code) AS IDENTIFIER, tpp.item_code, replace(tpp.price, ',', '.') AS ITEM_PRICE, REPLACE(avg(ppc.price), ',', '.') AS PRICE, 
      tpl.request_id, max(tpl.request_id) over (partition by tpp.item_code) as max_request
      FROM table_price_list tpl
      INNER JOIN table_price_product tpp ON tpp.list_header_id = tpl.list_header_id AND tpp.request_id = tpl.request_id
      INNER JOIN prices_per_client ppc ON tpp.item_code = ppc.item_code
      LEFT JOIN clients c ON ppc.customer_number = c.account_number
      WHERE SYSDATE BETWEEN NVL(tpp.start_date_active, SYSDATE) AND NVL(tpp.end_date_active, SYSDATE+1)
      GROUP BY DECODE(ppc.customer_class_code, 'E', c.description, ppc.customer_class_code), tpp.item_code, tpp.price, tpl.request_id) sub 
WHERE sub.identifier IS NOT NULL
and sub.request_id = sub.max_request
GROUP BY sub.item_code, sub.item_price;
 

Og en opdateret fiol med denne forespørgsel (Link )

Rediger 3:Tilføjet Erstat **Redigering 4:Tilføjet analytisk funktion **




  1. Simpel PHP SQL login fejlfinding

  2. Sådan optimerer du forespørgsel postgres

  3. INNER JOIN ON vs WHERE-klausul

  4. Konvertering af tal til ord i MYSQL-resultat! Brug af Query