Oracle SQL生成查询

Oracle SQL生成查询,sql,database,oracle,oracle10g,Sql,Database,Oracle,Oracle10g,下面是我的表模式 频道列表表: CHAN_NUMBER CHAN_NAME CHAN_TYPE ----------- ----------------------------------- 1 MTV Music 2 ESPN Sports 3 TNT Movies 4 Fox Movies

下面是我的表模式

频道列表表:

    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
我有这两个表,我需要生成一个报告,列出每个
频道
,以及有多少
客户
选择该频道作为他们的
最爱

在oracle数据库中,每次从调查表中选择频道作为收藏夹时,我都会生成一个计数。但是我不知道如何加入他们来创建一个频道列表,显示频道编号、名称以及选择它作为他们最喜欢的客户的数量

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

任何帮助都会很棒

您可以尝试以下方法:

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),如果我正确理解您的问题,您可以尝试以下方法:

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),如果我正确理解您的问题,请检查此参考*

您说过希望列出每个频道,并统计有多少客户选择该频道作为他们的最爱

让我们从嵌套到外部。嵌套查询您可以通过
收藏频道对
Survery
表分组中的客户数进行计数。每个通道意味着,您需要在
通道
表上执行
左连接
,以获取所有记录

查询:

(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:您可以忽略该SQLFIDLE表示例中的另一个旧表模式请注意,它在MYSQL中,但这是一个ANSI查询-因此您也可以将其应用于ORACLE。

请检查此参考*

您说过希望列出每个频道,并统计有多少客户选择该频道作为他们的最爱

让我们从嵌套到外部。嵌套查询您可以通过
收藏频道对
Survery
表分组中的客户数进行计数。每个通道意味着,您需要在
通道
表上执行
左连接
,以获取所有记录

查询:

(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:您可以忽略该SQLFIDLE表示例中的另一个旧表模式请注意它在MYSQL中,但是这是一个ANSI查询-因此您也可以将其应用于ORACLE。

假设
SURV\u FAV\u CHAN
CHAN\u NUMBER
是关系,将其用于您的
连接,因此尝试以下操作:

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

假设
SURV\u FAV\u CHAN
CHAN\u NUMBER
是关系,将其用于您的
加入
,因此尝试以下操作:

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

如果你能用预期的结果更新你的问题,那就太好了:)请看一下我为你提供的基于样本的答案。一旦你尝试了,请发表评论。如果你能用预期的结果更新你的问题,那就太好了:)请看一下我为你提供的基于样本的答案。一旦你们尝试了,就做评论。我得到一个错误,我在第6行缺少一个关键字,带有AS关键字。谢谢你的帮助。不确定这是不是神谕的东西。@Josecarillo是的,正如前面提到的,这是神谕的东西。因此,您可以将
作为
关键字删除。请在每一个正确输入的答案上做标记。这样社区就会知道,对于像你这样的问题,有不止一种解决方案这里有更多不同的查询变体供您使用:)我得到一个错误,第6行缺少一个关键字,带有AS关键字。谢谢你的帮助。不确定这是不是神谕的东西。@Josecarillo是的,正如前面提到的,这是神谕的东西。因此,您可以将
作为
关键字删除。请在每一个正确输入的答案上做标记。这样社区就会知道,对于像你这样的问题,有不止一种解决方案这里有更多不同的查询供您使用:)谢谢Skegg99这正是我所需要的。谢谢你,这正是我需要的。向你致敬。谢谢鲍勃,这是一种我能更好理解的格式,也能为我提供所需的答案。谢谢鲍勃,这是一种我能更好理解的格式,也能为我提供所需的答案。