2012-12-15 3 views
1

다음은 내 테이블 스키마입니다.Oracle SQL 생성 쿼리

채널 목록 테이블 :

CHAN_NUMBER CHAN_NAME CHAN_TYPE 
----------- ----------------------------------- 
     1 MTV     Music 
     2 ESPN     Sports 
     3 TNT     Movies 
     4 Fox     Movies 
     5 Fox     Sports 

고객 설문 조사 테이블 :

SURV_ID SURV_DATE SURV_FAV_CHAN CUST_NUMBER 
---------- --------- ------------- ----------- 
    1  25-NOV-12    1   2 
    2  24-NOV-12    2   1 
    3  24-NOV-12    3   3 
    4  24-NOV-12    4   4 
    5  24-NOV-12    5   5 
    6  24-NOV-12    1   6 
    7  24-NOV-12    2   7 
    8  24-NOV-12    3   8 
    9  24-NOV-12    4   9 
    10  24-NOV-12    5   10 
    11  24-NOV-12    1   11 

나는 모든 channelcount of을 나열하는 보고서를 생성 할 필요가이 두 테이블이 얼마나 많은 customersselected that channelfavorite.

oracle 데이터베이스에서 SURVEY 테이블에서 채널을 즐겨 찾기로 선택할 때마다 카운트를 생성하는 시점까지 왔습니다. 그러나 나는 을 어떻게 결합하여 채널을 표시하여 channel number을 표시하고 namecount of customers을 좋아하는 채널 목록을 만들 수 없습니다.

-- my channel table query 


SELECT CHAN_NUMBER, CHAN_NAME FROM CHANNEL; 


-- here is how I'm generating the couNt 


SELECT COUNT(SURV_FAV_CHAN) FROM SURVEY 
GROUP BY SURV_FAV_CHAN HAVING COUNT(SURV_FAV_CHAN) > 1; 

아무 도움도되지 않을 것입니다.

+1

당신이 예상 결과와 질문을 업데이트 할 수 있다면 그것은 좋은 것을 :)에서 봐 주시기 바랍니다 내가 당신을 위해 채운 샘플 기반 대답.일단 당신이 그것을 시도하면, 코멘트를해라. – bonCodigo

답변

1

당신은이 같은 시도 할 수 있습니다 :

SELECT MAX(CH.CHAN_NUMBER), MAX(CH.CHAN_NAME), COUNT(SRV.SURV_FAV_CHAN) FROM SURVEY SRV 
LEFT JOIN CHANNEL CH ON CH.CHAN_NUMBER = SRV.SURV_FAV_CHAN 
GROUP BY SRV.SURV_FAV_CHAN HAVING COUNT(SRV.SURV_FAV_CHAN) > 1; 

을 그리고 당신은 당신이 제대로

+0

감사합니다 Skegg99 이것은 정확히 내가 필요한 것입니다. 너에게 내 모자 야. –

2

하시기 바랍니다 질문을 이해한다면 당신이 정말로 고객의 총량을 필요로하는 경우 SUM (SRV.SURV_FAV_CHAN)를 사용할 수 있습니다 이 참조 확인 * SQLFIDDLE

은 모든 채널을 나열하고 해당 채널을 좋아하는으로 선택한 고객 수를 계산합니다.

중첩에서 바깥쪽으로가 봅시다. 중첩 된 쿼리를 사용하면 표 그룹화에서 고객 번호를 favourite channel까지 계산합니다. 모든 채널에서 모든 레코드를 얻으려면 LEFT JOINChannels 테이블에 입력해야합니다.

검색어 :

(select c.*, s.ct from 
channel c 
left join 
(select count(cust_number) as ct 
, surv_fav_chan from survey 
group by surv_fav_chan) as s 
on c.chan_number = s.surv_fav_chan 
; 

결과 :

CHAN_NUMBER  CHAN_NAME CHAN_TYPE CT 
1    MTV   Music  3 
2    ESPN  Sports  2 
3    TNT   Movies  2 
4    Fox   Movies  2 
5    Fox   Sports  2 

당신은 프로그램의 두 가지 유형을 제공 FOX이 같은 채널을 치료하는 것 같다. 그래서 나는 그것을 그대로 두었다. 채널 유형별로 고객 수를 계산하려면 명확히하십시오.

추신 : SQLFIDDLE 테이블 샘플에서 다른 기존 테이블 스키마를 무시할 수 있습니다. 참고 :은 MYSQL에 있지만 ANSI 쿼리이므로 오라클에도 적용 할 수 있습니다. SURV_FAV_CHANCHAN_NUMBER이 관계라고 가정

+0

6 번 줄에 AS 키워드가 누락되었습니다. 도와 주셔서 감사합니다. 그것이 오라클 일인지 확실하지 않습니다. –

+0

@JoseCarrillo 네, 언급 한대로 그것은 신탁입니다. 따라서 'AS'키워드를 삭제할 수 있습니다. 정확한 답변을 제공하는 모든 답을 표시하십시오. 따라서 커뮤니티는 귀하와 같은 질문에 대해 하나 이상의 솔루션이 있다는 것을 알고 있습니다. ;) – bonCodigo

+0

여기 당신이 주위에 놀 수있는 쿼리의 다른 변형이 있습니다 :) [SQLFIDDLE] (http://sqlfiddle.com/#!2/065e31/3) – bonCodigo

1

, 당신의 JOIN을 위해, 그래서이 시도 것을 사용

SELECT CHAN_NUMBER 
    , CHAN_NAME 
    , COUNT(DISTINCT SURVEY.CUST_NUMBER) AS FAV_CHANNEL_CNT 
FROM CHANNEL 
LEFT JOIN SURVEY 
ON  SURVEY.SURV_FAV_CHAN = CHANNEL.CHAN_NUMBER 
GROUP BY CHAN_NUMBER, CHAN_NAME 
+0

감사합니다 밥 이것은 훨씬 더 잘 이해할 수있는 형식입니다 또한 필요한 답변을 제공합니다. –