1

以下是我的表架构。

频道列表表:

    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

我有这两个表,我需要生成一个报告,列出每个channel和有多少count of作为他们的.customersselected that channelfavorite

在 oracle 数据库上,我开始计算每次从 SURVEY 表中选择一个频道作为收藏夹时的计数。但我不知道如何加入他们来创建一个频道列表,显示channel numbernamecount 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;

任何帮助都是极好的。

4

3 回答 3

2

请检查此参考 * SQLFIDDLE

您说要列出每个频道,并计算有多少客户选择了该频道作为他们的最爱

让我们从嵌套到外部。嵌套查询,您计算Survery表分组中的客户数量favourite channel。每个通道都意味着,您需要做一个LEFT JOINon Channelstable 来获取所有记录。

询问:

(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。

于 2012-12-15T20:20:53.973 回答
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)

于 2012-12-15T20:12:17.247 回答
1

假设SURV_FAV_CHANandCHAN_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
于 2012-12-15T20:29:33.123 回答