मैं विंडोज़ पर ओरेकल 12.1 चला रहा हूं। मुझे तिथि के अनुसार एक सूची बनाने में मदद चाहिए (पूरा दिन दिन की स्थिति है, ट्रंक (दिनांक)) और स्थान और सूची परिणाम में उस दिन के लिए इन्वेंट्री प्रकार की मात्रा की गणना करना। मैं सूची को समग्र रूप से दिखाने के लिए इसे car_equipment तालिका का एक दृश्य बनाने की योजना बना रहा हूं।
मैंने अधिकतम (दिनांक) के लिए सूची की सूची दिखाने से पहले एक सरल दृश्य बनाया है।

CREATE OR REPLACE FORCE NONEDITIONABLE VIEW "DB1"."CAR_INVENTORY_VW" ("MAX_INVENTORY_DATE","LOCATION", "INVENTORY_LIST") AS 
 SELECT 
  inventory_date max_inventory_date,
  location,
  LISTAGG(num_cars || ' ' || equipment_type, ', ') 
    WITHIN GROUP (ORDER BY equipment_type) inventory_list
      FROM (
        SELECT c.*, RANK() OVER(PARTITION BY location ORDER BY inventory_date DESC) rn
            FROM car_equipment c
           ) x 
           WHERE rn = 1
            GROUP BY inventory_date, location;

लेकिन अब मैं किसी स्थान के लिए सभी तिथियां दिखाना चाहता हूं और प्रति स्थान तिथि के अनुसार सूची प्रकारों की गणना का योग एकत्र करना चाहता हूं। तालिका और पंक्तियाँ बनाने के लिए कोड नीचे दिया गया है: पहले तालिका बनाएँ और डेटा स्थिति के उदाहरण के लिए पंक्तियाँ सम्मिलित करें।

CREATE TABLE "CAR_EQUIPMENT" 
   ("NUM_CARS" NUMBER(10,0), 
"EQUIPMENT_TYPE" VARCHAR2(100 BYTE), 
"LOCATION" VARCHAR2(500 BYTE), 
"INVENTORY_DATE" DATE) 
SEGMENT CREATION IMMEDIATE 
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
NOCOMPRESS LOGGING
   STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
   PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
   BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
   TABLESPACE "USERS" ;

INSERT INTO "CAR_EQUIPMENT" (NUM_CARS, EQUIPMENT_TYPE, LOCATION, INVENTORY_DATE) VALUES ('8', 'Rovers', 'coventry', TO_DATE('2019-09-07 09:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO "CAR_EQUIPMENT" (NUM_CARS, EQUIPMENT_TYPE, LOCATION, INVENTORY_DATE) VALUES ('1', 'Rovers', 'coventry', TO_DATE('2019-09-07 18:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO "CAR_EQUIPMENT" (NUM_CARS, EQUIPMENT_TYPE, LOCATION, INVENTORY_DATE) VALUES ('9', 'Jaguars', 'coventry', TO_DATE('2019-09-07 06:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO "CAR_EQUIPMENT" (NUM_CARS, EQUIPMENT_TYPE, LOCATION, INVENTORY_DATE) VALUES ('7', 'Rovers', 'leamington', TO_DATE('2019-08-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO "CAR_EQUIPMENT" (NUM_CARS, EQUIPMENT_TYPE, LOCATION, INVENTORY_DATE) VALUES ('10','Trans Am', 'leamington', TO_DATE('2019-08-30 09:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO "CAR_EQUIPMENT" (NUM_CARS, EQUIPMENT_TYPE, LOCATION, INVENTORY_DATE) VALUES ('2','Trans Am', 'leamington', TO_DATE('2019-08-30 18:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO "CAR_EQUIPMENT" (NUM_CARS, EQUIPMENT_TYPE, LOCATION, INVENTORY_DATE) VALUES ('8', 'Rovers', 'coventry', TO_DATE('2019-09-06 18:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO "CAR_EQUIPMENT" (NUM_CARS, EQUIPMENT_TYPE, LOCATION, INVENTORY_DATE) VALUES ('4', 'Rovers', 'leamington', TO_DATE('2019-09-06 09:00:00', 'YYYY-MM-DD HH24:MI:SS'));

commit;

मुझे ऐसे उदाहरण नहीं मिले जहाँ मुझे listagg के भीतर sum(num_cars) मिल सके।
इसके अलावा, (और मुझे यहां एक अनुवर्ती प्रश्न पूछने से नफरत है), लेकिन क्या होगा यदि सूची कुल 4000 बाइट्स से अधिक हो। मैंने पढ़ा है कि xmlagg का उपयोग किया जा सकता है, लेकिन यदि परिणाम 4000 बाइट्स से अधिक हो तो सूची दिखाने का सबसे अच्छा तरीका क्या होगा। क्या आपने पहले इस समस्या का सामना किया है और आप उस समस्या का समाधान कैसे करते हैं। किसी भी सलाह के लिए फिर से धन्यवाद। हार्दिक सादर, गिली

मैंने कोशिश की:

create or replace view TEST_LAGG(
  WITH
  TEMP AS (SELECT LOCATION,
                  trunc(INVENTORY_DATE) inventory_date,
                  EQUIPMENT_TYPE,
                  sum(NUM_CARS) sum_num_cars
           from CAR_EQUIPMENT
           group by LOCATION,
                    trunc(INVENTORY_DATE),
                    EQUIPMENT_TYPE
         )
   select LOCATION,
          INVENTORY_DATE,
          listagg(sum_num_cars ||' '|| EQUIPMENT_TYPE, ', ') within group (order by inventory_date) lagg
   from TEMP
   group by LOCATION,
        inventory_date);

लेकिन मुझे ORA-00903 मिलता है: अमान्य तालिका का नाम 00903. 00000 - "अमान्य तालिका नाम"

लिटिलफुट के लिए फिर से धन्यवाद, मैंने कोशिश की:

create or replace view TEST_LAGG
 AS WITH
  TEMP (SELECT LOCATION,
                  trunc(INVENTORY_DATE) inventory_date,
                  EQUIPMENT_TYPE,
                  sum(NUM_CARS) sum_num_cars
           from CAR_EQUIPMENT
           group by LOCATION,
                   trunc(INVENTORY_DATE),
                    EQUIPMENT_TYPE
         )
    select LOCATION,
      INVENTORY_DATE,
      listagg(sum_num_cars ||' '|| EQUIPMENT_TYPE, ', ') within group   (order by inventory_date) lagg
 from TEMP
 group by LOCATION,
        inventory_date;

लेकिन मुझे त्रुटि मिलती है: ORA-00903: अमान्य तालिका का नाम ००९०३. ००००० - "अमान्य तालिका नाम" *कारण:
*कार्य: पंक्ति में त्रुटि: १३५ कॉलम: ३ -- TEMP तालिका संदर्भ पंक्ति।

0
Gilly 21 अक्टूबर 2019, 21:31

1 उत्तर

सबसे बढ़िया उत्तर

आपको पहले उस राशि की गणना करनी होगी, और फिर उसे सूची में उपयोग करना होगा। कुछ इस तरह:

SQL>     with
  2        temp as (select location, inventory_date, equipment_type, sum(num_cars) sum_num_cars
  3                 from car_equipment
  4                 group by location, inventory_date, equipment_type
  5                )
  6      select location,
  7             inventory_date,
  8             listagg(sum_num_cars ||' '|| equipment_type, ', ') within group (order by inventory_date) lagg
  9      from temp
 10      group by location,
 11               inventory_date;

LOCATION        INVENTORY_DATE      LAGG
--------------- ------------------- ------------------------------
coventry        2019-09-06 18:00:00 8 Rovers
coventry        2019-09-07 06:00:00 9 Jaguars
coventry        2019-09-07 09:00:00 8 Rovers
coventry        2019-09-07 18:00:00 1 Rovers
leamington      2019-08-30 00:00:00 7 Rovers
leamington      2019-08-30 09:00:00 10 Trans Am
leamington      2019-08-30 18:00:00 2 Trans Am
leamington      2019-09-06 09:00:00 4 Rovers

8 rows selected.

SQL>

अब, यह इस बात पर निर्भर करता है कि आप परिणाम के रूप में वास्तव में क्या प्राप्त करना चाहते हैं (विवरण को काफी समझ में नहीं आया; नमूना आउटपुट मदद करेगा), लेकिन मुझे आशा है कि आपको यह विचार मिल जाएगा।

आपके दूसरे प्रश्न के अनुसार: हाँ, वह XMLAGG है जिसका उपयोग आपको करना होगा यदि परिणाम 4000 वर्णों की सीमा से अधिक है।


[संपादित करें]

आह; ऐसा लगता है कि यह TRUNC(inventory_date) आपको चाहिए। यह दिनांक कॉलम से समय घटक निकाल देगा।

SQL> with
  2    temp as (select location,
  3                    trunc(inventory_date) inventory_date,
  4                    equipment_type,
  5                    sum(num_cars) sum_num_cars
  6             from car_equipment
  7             group by location,
  8                      trunc(inventory_date),
  9                      equipment_type
 10            )
 11  select location,
 12         inventory_date,
 13         listagg(sum_num_cars ||' '|| equipment_type, ', ') within group (order by inventory_date) lagg
 14  from temp
 15  group by location,
 16           inventory_date;

LOCATION        INVENTORY_DATE      LAGG
--------------- ------------------- ------------------------------
coventry        2019-09-06 00:00:00 8 Rovers
coventry        2019-09-07 00:00:00 9 Jaguars, 9 Rovers
leamington      2019-08-30 00:00:00 12 Trans Am, 7 Rovers
leamington      2019-09-06 00:00:00 4 Rovers

SQL>

[संपादित करें: एक दृश्य बनाएं]

SQL> create or replace view TEST_LAGG as
  2    WITH
  3    TEMP AS (SELECT LOCATION,
  4                    trunc(INVENTORY_DATE) inventory_date,
  5                    EQUIPMENT_TYPE,
  6                    sum(NUM_CARS) sum_num_cars
  7             from CAR_EQUIPMENT
  8             group by LOCATION,
  9                      trunc(INVENTORY_DATE),
 10                      EQUIPMENT_TYPE
 11           )
 12     select LOCATION,
 13            INVENTORY_DATE,
 14            listagg(sum_num_cars ||' '|| EQUIPMENT_TYPE, ', ') within group (order by inventory_date) lagg
 15     from TEMP
 16     group by LOCATION,
 17          inventory_date;

View created.

SQL> select * from test_lagg;

LOCATION        INVENTORY_DATE      LAGG
--------------- ------------------- ------------------------------
coventry        2019-09-06 00:00:00 8 Rovers
coventry        2019-09-07 00:00:00 9 Jaguars, 9 Rovers
leamington      2019-08-30 00:00:00 12 Trans Am, 7 Rovers
leamington      2019-09-06 00:00:00 4 Rovers

SQL>
1
Littlefoot 21 अक्टूबर 2019, 23:15