【发布时间】:2019-10-21 18:31:48
【问题描述】:
我在 Windows 上运行 Oracle 12.1。
我需要帮助按日期(整天是日期条件,trunc(date))和位置创建列表聚合,并在列表结果中计算当天的库存类型数量。我计划将此作为 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: invalid table name 00903. 00000 - “无效的表名”
再次感谢Littlefoot,我试过了:
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:无效的表名
00903. 00000 - “无效的表名”
*原因:
*行动:
行错误:135 列:3 -- TEMP 表参考行。
【问题讨论】:
-
不错的细节。您能否也显示预期的输出?
-
日期位置 CAR_LIST 2019-09-07 Coventry 9 Rovers | 9 美洲虎
-
列标题为 DATE LOCATION CAR_LIST