2014-08-27 3 views
1

각 자산 위치의 케이블 수를 얻기 위해 쿼리를 작성하려고합니다. 흐름은 프로젝트 -> 자산 -> 케이블입니다. 하나의 프로젝트는 이러한 자산과 연결된 여러 개의 케이블로 여러 개의 자산을 가질 수 있습니다. 아래는 데이터의 스냅 샷입니다.Oracle SQL 조건에 기반한 계산

RECORD_ID PARENT_RECORD_ID FORM_NAME PARENT_FORM FIELD_NAME VALUE 
    1604   1603   asset   project  serial  b345s 
    1604   1603   asset   project  location OH 
    1605   1604   cable   asset   zone  green 
    1606   1603   asset   project  location NY 
    1607   1606   cable   asset   port  2 

당신이 케이블 수준에서, 위에서 볼 수있는 바와 같이, PARENT_RECORD_ID은 자산의 "RECORD_ID"입니다. 사이에 많은 데이터가있는 수천 개의 행이 있기 때문에 이것은 단지 스냅 샷이지만 관련 데이터 만 표시하려고했습니다.

자산 당 케이블 수를 롤업 한 다음 '위치'별로 자산을 그룹화하는 방법을 찾아야합니다. 'location'은 자산의 FIELD_NAME 열에있는 값이며 VALUE 열의 값과 연관되어 있습니다. 예를 들어, 자산 ID 1604의 '위치'는 'OH'입니다.

지금까지 총 케이블 수를 계산할 수있었습니다. 나는 이것들을 어떻게 '자산'의 '위치'로 나누는 지 알아낼 필요가 있습니다.

SELECT 
    COUNT(DISTINCT RECORD_ID) "Number of Cables" 
FROM 
    PROJECT_TABLE 
WHERE 
    LOWER(FORM_NAME) = 'cable' 
위의 쿼리의

현재 결과 :

Location  Number of Cables 
    OH    552 
    NY    1042 
    MI    49 
    CA    1494 

어떤 도움을 주시면 더 좋구요 : 나는 결과를 원하는 무엇

Number of Cables 
    3137 

모양을 위해! 감사!

+0

글쎄, 어느 열이 "위치"입니까? – OldProgrammer

+0

위치 란? 그것이 동일한 테이블의 일부인 경우 select 문에 포함하십시오. 다른 테이블과 결합하십시오. 내가 논리가 빠지지 않는 한 똑바로 보인다? – programnub112

+0

나는 사과한다, 나는 그 지위에서 그것을 깨끗하게 할 것이다. '위치'는 저작물의 'FIELD_NAME'열에있는 값입니다. 같은 행의 VALUE 열에 해당 FIELD_NAME '위치'와 연결된 상태가 있습니다. – ad2387

답변

1

트릭을해야합니다.

select 
    ass.VALUE as LOCATION, 
    COUNT(DISTINCT cab.RECORD_ID) as CABLE_COUNT 
from 
    PROJECT_TABLE cab 
    inner join PROJECT_TABLE ass on ass.RECORD_ID = cab.PARENT_RECORD_ID 
where 
    cab.FORM_NAME = 'cable' and 
    ass.FORM_NAME = 'asset' and -- should always be the case? 
    ass.FIELD_NAME = 'location' 
group by 
    ass.VALUE 

몇 가지 팁 : 테이블에 대한

  • 사용 별칭. 이 경우 동일한 테이블이 두 번 사용되기 때문에 꼭해야하지만 필자는 그렇게하지 않아도됩니다.
  • 별칭을 사용하는 경우 애셋을 쿼리하는 경우 ass과 같은 약어를 사용해야합니다. 그것은 인생의 작은 기쁨 중 하나입니다. :)
  • lower을 삭제했습니다. 그것이 필요하지 않다면, 그것을 버려라. 함수를 호출 할 필요없이 인덱스를 완벽하게 사용할 수 있으므로 쿼리가 빨라집니다. 모든 값의 대소 문자가 같거나 더 나은지 확인한 다음 숫자 ID가있는 이름이 포함 된 Forms 테이블을 만들고 다른 테이블에서이 ID를 사용하십시오. (Google 대리 키). 또는 함수 색인을 살펴보십시오. 이를 통해 오라클은 정상적인 값 대신에 함수 결과를 기반으로 인덱스를 구축 할 수 있습니다.
  • 케이블에 대한 레코드가 하나만있는 경우 카운트에 distinct이 필요하지 않으므로 ass.FORM_NAME = 'asset' 조건이 필요하지 않으므로 쿼리가 조금 더 최적화됩니다.
  • FORM_NAMEVALUE의 조합 된 색인은 유용하지만 두 조건 (검색어의 주석 참조)이 필요하고 lower (위의 두 가지 설명 참조)을 사용하지 않는 한 유용합니다.
  • 일반적으로 이러한 모든 목적의 테이블은 나쁜 습관입니다. 자산, 프로젝트 및 위치에 대해 별도의 테이블을 가지고 적절하고 정규화 된 모델을 만들면보다 읽고 유지할 수있는 데이터 모델을 훨씬 쉽게 읽을 수 있고 사용할 수 있습니다.
+0

답변 해 주셔서 감사합니다. 쿼리는 현재 데이터를 반환하지 않으므로 그 이유는 무엇입니까?/ – ad2387

+0

밑줄이 누락 된'RECORD_ID' 및'PARENT_RECORD_ID'가 있습니다. 그것 외에, 나는 틀린 것을 보지 못한다. 그러나 나는 메모장에 그것을 타이프했다. 그래서 나는 뭔가를 간과 할 수도있다. – GolezTrol

+0

그래, 쿼리가 오류없이 실행 중입니다. 지금은 아무 것도 반환하지 않습니다. – ad2387

관련 문제