2014-07-10 3 views
0

주문 유형에 따라 주문 및 주문 회선을 계산하려고합니다. 지금까지 주문 유형별 주문 헤더를 계산했습니다.오라클 SQL 합계를 통한 계산

SELECT lifnr, 
    COUNT(CASE WHEN e1.bsart = 'NB' THEN 1 ELSE NULL END) Schedule_Orders, 
    COUNT(CASE WHEN e1.bsart = 'ZNBS' THEN 1 ELSE NULL END) Store_Orders, 
    COUNT(CASE WHEN e1.bsart = 'ZCSO' THEN 1 ELSE NULL END) Third_Party, 
    COUNT(CASE WHEN e1.bsart NOT IN ('ZCSO', 'NB', 'ZNBS') THEN 1 ELSE NULL END) Other_Orders, 
    COUNT(*) Total_Orders 
FROM saprpe.ekko e1 
JOIN saprpe.ekpo p1 
ON e1.ebeln = p1.ebeln 
WHERE e1.aedat BETWEEN '20130701' AND '20140701' 
GROUP BY lifnr 

주문 행은 EKPO 테이블에 저장되므로 문서 번호를 사용하여 EKKO에 가입했습니다. 위의 경우 주문 유형별 주문 라인 수를 계산하려면 어떻게해야합니까? 나는 단지 모든 주문 유형을위한 것이 아닌 모든 주문 라인을 계산할 수있었습니다.

추가 정보 : 주문 헤더는 공급 업체, 주문 번호 및 주문 유형을 포함하는 EKKO에 저장됩니다. EKKO는 주문 행을 포함하는 테이블 EKPO와 1 대 다수의 관계를가집니다. 주문 라인은 주문 번호를 통해 주문 헤더와 관련됩니다. 내가하려고하는 것은 NB, ZNBS 및 ZCSO의 세 가지 주문 유형과 각 주문 유형의 총계 행에 대한 총 주문 헤더를 얻는 것입니다. 모두 자신의 란에

예를 들면 나는보고 싶다; 내가 경우

Vendor1, 10 개 NB 주문, 100 개 NB 주문 라인, 0 ZNBS 주문, 0 ZNBS 주문 라인, 5 개 ZCSO 주문, 15 개 ZCSO 주문 라인, 15 개 총 주문, 115 총 주문 라인

지적하십시오 무엇이든 명확히 할 필요가있다. 나는 단일 SQL 쿼리에서 이것을 선호한다는 것을 알아야한다. WHERE 절을 사용하여 각 Order Type에 대해 개별 쿼리 단위로 관리 할 수있다.

+0

샘플 데이터와 원하는 결과를 제공 할 수 있습니까? 나는 아직도 당신이 무엇을 의미하는지 모른다. "위의 경우 각 주문 유형에 대한 주문 행을 어떻게 계산합니까?" –

+0

여기 샘플 데이터를 포맷하려고하는 악몽이었습니다! 내용을 더 명확하게 편집합니다 – Dan

답변

0

몇 번의 시행 착오 끝에 인터넷 검색 등의 결과가 나왔습니다.

SELECT 
    lifnr, 
    COUNT(DISTINCT (CASE WHEN e1.bsart = 'NB' THEN e1.ebeln ELSE NULL END)) Schedule_Orders, 
    COUNT(CASE WHEN e1.bsart = 'NB' THEN e1.ebeln ELSE NULL END) Schedule_Order_Lines, 
    COUNT(DISTINCT (CASE WHEN e1.bsart = 'ZNBS' THEN e1.ebeln ELSE NULL END)) Store_Orders, 
    COUNT(CASE WHEN e1.bsart = 'ZNBS' THEN e1.ebeln ELSE NULL END) Store_Order_Lines, 
    COUNT(DISTINCT (CASE WHEN e1.bsart = 'ZCSO' THEN e1.ebeln ELSE NULL END)) Third_Party, 
    COUNT(CASE WHEN e1.bsart = 'ZCSO' THEN e1.ebeln ELSE NULL END) Third_Party_Lines, 
    COUNT(DISTINCT (CASE WHEN e1.bsart NOT IN ('ZCSO', 'NB', 'ZNBS') THEN e1.ebeln ELSE NULL END)) Other_Orders, 
    COUNT(CASE WHEN e1.bsart NOT IN ('ZCSO', 'NB', 'ZNBS') THEN e1.ebeln ELSE NULL END) Other_Order_Lines, 
    COUNT(DISTINCT(e1.ebeln)) Total_Orders, 
    COUNT(e1.ebeln) Total_Order_Lines 
FROM saprpe.ekko e1 
LEFT JOIN saprpe.ekpo p1 
ON e1.ebeln = p1.ebeln 
WHERE e1.aedat BETWEEN '20130701' AND '20140701' 
GROUP BY lifnr 

는 원래 라인 카운트가 카운트 저를 활성화 내 헤더 내 헤더 카운트에 DISTINCT 추가 및 케이스를 사용하여 ... 때문에 테이블 사이의 관계의 라인과 같은 수를 계산하고 있었다 JOIN 그 주문 유형.

+0

"디코드"키워드를 살펴보아야 할 수도 있습니다. 귀하의 사례 - 진술을 간소화 할 수 있습니다. 항상 대체 할 수는 없지만 가능한 경우 좋은 예처럼 보입니다. – Hambone

+0

멋진 감사, 나는 그것을 체크 아웃합니다! – Dan