sql >> データベース >  >> RDS >> Oracle

JSONの作成と複雑なクエリの編集(oracle 11g)

    ほとんどのコードを次のクエリに置き換えることができると思います。 IN句を調整する必要がある場合があります。これは、顧客リストを大幅に変更する場合は面倒です。しかし、これはあなたの結果を複製します:

    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));
    

    これがアップデートfiddle です。 。

    JSON出力については、コア機能の一部になっているため、新しいバージョンを使用している方がはるかに簡単です。

    編集:コメントごとにXML機能を追加する

    このクエリを確認できます:

    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;
    

    これは、そのクエリで更新されたフィドルです(リンク

    これにより、次の出力が生成されます。

    <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>
    

    編集2:文字列連結によるJSONの追加

    以下は、直接文字列連結を介してJSONを出力します。

    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;
    

    そして、このクエリで更新されたフィドル(リンク

    編集3:置換を追加 **編集4:分析機能を追加**




    1. 登録フォームからPHP/Htmlを使用してSQLテーブルにデータを入力しようとしています

    2. MySQLで小数範囲の度数分布を取得します

    3. 距離パフォーマンスを備えたMYSQLGeoSearch

    4. ハウツー:検索結果のランキング