2017-04-17 120 views
0

声明:我怎样才能做到这一点Oracle查询

SERIES: 
title   
total_seasons 

SEASONS: 
title   
season  
avgduration 
episodes 
PRIMARY KEY (title, season), 
FOREIGN KEY (title) REFERENCES SERIES 

LIC_SERIES: 
id_client 
datetime 
title 
season 
episode 
PRIMARY KEY (client,title,season,episode) 
FOREIGN KEY (title,season) REFERENCES seasons 

系列例子是这样的:

Title  Total_Seasons 
House  8 
Lost  6 

四季如

表 “谁购买了全套系列许可证的客户”看起来像这样:

Title Season AvgDuration Episodes 
House 1  44   22 
Mad Men 3  47   13 

Lic_Series例子是这样的:

Client Datetime Title Season Episode 
92/657/T 01/01/2017 House 8  18 

我试过吗?

WITH PART AS (SELECT DISTINCT EPISODES, TITLE 
FROM SEASONS INNER JOIN SERIES 
ON Seasons.Title = Series.Title 
GROUP BY Seasons.Title) 

SELECT CLIENT 
FROM LIC_SERIES INNER JOIN PART 
ON LIC_SERIES.TITLE = PART.TITLE 
ORDER BY title DESC; 

我不知道如何检查,如果一个客户有所有每个赛季

+1

GROUP BY无效。一般的GROUP BY规则说:如果指定了GROUP BY子句,SELECT列表中的每个列引用必须标识一个分组列或者是一个set函数的参数。 – jarlh

+0

为什么GROUP BY在不涉及集合函数时?而SELECT DISTINCT与GROUP BY结合在一起也很少有用 - 只适用于有经验的用户! – jarlh

+0

添加更多样本表数据,以及其预期结果。 – jarlh

回答

0

这将返回所有和没有发作的次数所拥有的情节,并且有问题的一系列的四季由每个季节的每个客户。要检查是否拥有所有剧集,请对episodes_not_owned为零的摘要执行额外的检查。

WITH PART AS 
(SELECT DISTINCT s2.TITLE, s1.SEASON, s2.EPISODE 
FROM SEASONS s1 
INNER JOIN SERIES s2 
ON s1.Title = s2.Title 
) 
,summary as (
SELECT l.CLIENT 
     ,p.SEASON 
     ,SUM(CASE WHEN l.episode is not null THEN 1 ELSE NULL END) as episodes_owned 
     ,SUM(CASE WHEN l.episode is null THEN 1 ELSE NULL END) as episodes_not_owned 
FROM LIC_SERIES l 
RIGHT OUTER JOIN PART p 
ON l.TITLE = p.TITLE 
AND l.EPISODE = p.EPISODE 
AND l.SEASON = p.SEASON 
GROUP BY l.CLIENT, p.SEASON 
ORDER BY l.CLIENT, p.SEASON DESC 
) 
SELECT s.client 
     ,s.season 
     ,s.episodes_owned 
     ,s.episodes_not_owned 
     ,case when s.episodes_not_owned = 0 THEN 'Yes' ELSE 'No' END as all_owned 
from summary s; 
+0

它说:'错误SQL:ORA-00904:“S1”。“EPISODE”:无效标识符 00904. 00000 - “%s:无效标识符” *原因: *操作:'@Jeremy Real – Junior

+0

@Junior I已经更新,从s2而不是s1中拉开情节。引用了错误的表格。您的表格描述调用字段'episodes',但您的查询使用'episode'。如果它应该是复数,您可能需要更新该字段名称。 –

+0

你是对的复数。现在错误是与S2! xD'错误SQL:ORA-00904:“S2”。“EPISODE”:无效标识符 00904. 00000 - “%s:无效标识符” *原因: *行动:'但是,好吧,我认为我可以用这个(让希望) – Junior

相关问题