2012-12-15 80 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 channel作爲他們的favorite

在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; 

而且你可能需要使用SUM(SRV.SURV_FAV_CHAN)如果你真的需要客戶的總量,如果我理解你的問題正確

+0

謝謝Skegg99這正是我所需要的。我的帽子給你。 –

2

請檢查此參考號碼SQLFIDDLE

你說你想要列出每個頻道,並計算有多少客戶已選擇該頻道作爲他們的最愛

讓我們從嵌套到外部。您嵌套的查詢您從Survery表分組favourite channel統計客戶數。每個頻道意味着,您需要在Channels表上執行LEFT JOIN以獲取所有記錄。

查詢:

(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爲兩個通道提供兩種不同類型的節目。所以我已經離開了它。如果你想通過渠道類型來統計顧客,那麼請澄清。

PS:您可以忽略該SQLFIDDLE表示例中的其他舊錶架構。 注意它在MYSQL,但是這是一個ANSI查詢 - 所以你也可以將它應用到ORACLE。

+0

我得到一個錯誤,我在AS 6關鍵字上丟失了一個關鍵字。謝謝您的幫助。不知道這是否是Oracle的事情。 –

+0

@JoseCarrillo是的,如上所述,這是一個oracle事物。所以你可以刪除'AS'關鍵字。並且請標記每個給您正確輸入的答案。所以社區會知道,對於像你這樣的問題,有多個解決方案。 ;) – bonCodigo

+0

這裏有更多不同的查詢供你玩耍:) [SQLFIDDLE](http://sqlfiddle.com/#!2/065e31/3) – bonCodigo

1

假設SURV_FAV_CHANCHAN_NUMBER是關係,請使用您的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

感謝Bob這是一種我能理解得更好的格式也爲我提供了所需的答案。 –