场景
在VER_ID(主键)的表中,数据存储在具有不同ATTR_SPEC_ID的多个行中。我想要的数据很少,但我希望以列格式(见屏幕截图)将其与其他ATTR_SPEC_ID连接起来。
而且我不希望查询太昂贵,因为在生产中它需要时间。那么,处理这种情况的最佳方法是什么呢?
表内容

期望输出

查询的一部分--我关心的是

全查询
SELECT COUNT(CUST_ORD_NO),ORDER_DELIVERY_DATE,SCENARIO
FROM
(WITH
CFS_ORD AS --- To Filter and get details of Running Retail Order
(
SELECT CF.ORD_NO,CF.CUST_ORD_NO,CF.RFS_DATE AS ORDER_DELIVERY_DATE
FROM OM_CFS_ORD CF
JOIN OPBS_DICT_VALUE OD ON CF.STAGE=OD.VALUE
WHERE CF.CFS_SPEC_ID ='C16080300451141' -- SPEC_ID OF EU_ACCESS
AND CF.ORD_STATE NOT IN('F','C') -- To exclude order that has reached end state
AND OFFER_NAME='Retail Access'
AND OD.DICT_ID = 'OM_ORD_STAGE'
AND STATE='A'
AND CF.RFS_DATE < TRUNC(SYSDATE)
AND CF.RFS_DATE > TRUNC(SYSDATE-60)
),
CFS_MAIN AS -- To Get VER_ID of EU_ACCESS of the Order
(
SELECT VER_ID,CUST_ORD_NO,SERVICE_NO,CREATE_ORD
FROM SRV_CFSVER_CT_MAIN
WHERE VER_STATE='O'
AND CFS_SPEC_ID ='C16080300451141' -- TO filter EU Access of Retail orders
),
CFS_ATTR AS ( -- To get necessary attributes
SELECT DISTINCT CFS_ATTRO.VER_ID,
(SELECT ATTR_VAL FROM SRV_CFS_VER_ATTR WHERE VER_ID=CFS_ATTRO.VER_ID AND ATTR_ID='C16080300451141.APPOINTMENT_ACT_TYPE' ) AS APPOINTMENT_ACTIVITY_TYPE,
(SELECT ATTR_VAL FROM SRV_CFS_VER_ATTR WHERE VER_ID=CFS_ATTRO.VER_ID AND ATTR_ID='C16080300451141.NL_TYPE' ) AS NL_TYPE,
(SELECT ATTR_VAL FROM SRV_CFS_VER_ATTR WHERE VER_ID=CFS_ATTRO.VER_ID AND ATTR_ID='C16080300451141.PATCHLESS' ) AS PATCH_LESS,
(SELECT ATTR_VAL FROM SRV_CFS_VER_ATTR WHERE VER_ID=CFS_ATTRO.VER_ID AND ATTR_ID='C16080300451141.CARRIER_TECH_TYPE' ) AS TECHNOLOGY_TYPE,
(SELECT ATTR_VAL FROM SRV_CFS_VER_ATTR WHERE VER_ID=CFS_ATTRO.VER_ID AND ATTR_ID='C16080300451141.CARRIER_TYPE' ) AS CARRIER_TYPE
FROM SRV_CFS_VER_ATTR CFS_ATTRO
WHERE CFS_ATTRO.ATTR_ID IN ('C16080300451141.PATCHLESS','C16080300451141.NL_TYPE','C16080300451141.APPOINTMENT_ACT_TYPE','C16080300451141.CARRIER_TECH_TYPE')
),
APPOINTMENT AS
(
SELECT ORD_NO,APPOINTMENT_NO
FROM OM_ORD_TIMESLOT
WHERE STATE='A'
)
SELECT CFS_ORD.CUST_ORD_NO,CFS_ORD.ORDER_DELIVERY_DATE,
CASE
WHEN CFS_ATTR.APPOINTMENT_ACTIVITY_TYPE IS NULL AND CFS_ATTR.CARRIER_TYPE <> 'Fiber' THEN 'nDIY'
WHEN CFS_ATTR.PATCH_LESS = 'Y' THEN 'PATCHLESS'
WHEN CFS_ATTR.APPOINTMENT_ACTIVITY_TYPE IS NOT NULL THEN 'DIY'
WHEN APPOINTMENT.APPOINTMENT_NO IS NOT NULL AND CFS_ATTR.CARRIER_TYPE = 'Fiber' THEN 'DIY'
WHEN APPOINTMENT.APPOINTMENT_NO IS NULL AND CFS_ATTR.CARRIER_TYPE = 'Fiber' THEN 'nDIY'
END AS SCENARIO
FROM CFS_ORD
JOIN CFS_MAIN ON CFS_ORD.ORD_NO=CFS_MAIN.CREATE_ORD
JOIN CFS_ATTR ON CFS_MAIN.VER_ID=CFS_ATTR.VER_ID
LEFT JOIN APPOINTMENT ON APPOINTMENT.ORD_NO=CFS_ORD.ORD_NO
--WHERE CFS_ORD.CUST_ORD_NO LIKE '%@KPN_CM'
)
GROUP BY ORDER_DELIVERY_DATE,SCENARIO
ORDER BY ORDER_DELIVERY_DATE发布于 2020-04-16 17:04:09
听起来你需要使用枢轴https://www.techonthenet.com/oracle/pivot.php
如果您可以使用您提供的测试数据(基于期望的输出)填充http://sqlfiddle.com/示例,如果遇到困难,我可以帮助您编写查询。
https://stackoverflow.com/questions/61255718
复制相似问题