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这正是我所需要的。谢谢你,这正是我需要的。向你致敬。谢谢鲍勃,这是一种我能更好理解的格式,也能为我提供所需的答案。谢谢鲍勃,这是一种我能更好理解的格式,也能为我提供所需的答案。