Sql server 使用OVER()如果客户有watch gladiator,则使用1或0 SQL SERVER
我想我需要一些关于我的问题的指导。我正在努力Sql server 使用OVER()如果客户有watch gladiator,则使用1或0 SQL SERVER,sql-server,Sql Server,我想我需要一些关于我的问题的指导。我正在努力 Watched_Gladiator=CASE WHEN FilmName IN (CASE WHEN FilmName LIKE '%Gladiator%' THEN 1 END) then OVER(PARTITION BY Cust_Nr) THEN 1 ELSE 0 END 我也试过这个: Watched_Gladiator=CASE WHEN FilmName IN (CASE WHEN FilmName LIKE '%Gladiator
Watched_Gladiator=CASE WHEN FilmName IN (CASE WHEN FilmName LIKE '%Gladiator%' THEN 1 END) then OVER(PARTITION BY Cust_Nr) THEN 1 ELSE 0 END
我也试过这个:
Watched_Gladiator=CASE WHEN FilmName IN (CASE WHEN FilmName LIKE '%Gladiator%' THEN Filmnamne END) then OVER(PARTITION BY Cust_Nr) THEN 1 ELSE 0 END
我当前收到的错误是:
Incorrect syntax near the keyword 'OVER'.
这基本上就是我的数据的样子
Cust_Nr Date FilmName Watched Gladiator
157649306 20150430 Gladiator 1
158470722 20150504 Nick Cave: 20,000 Days On Earth 0
158467945 20150504 Out Of The Furnace 0
158470531 20150504 FilmA 0
157649306 20150510 Gladiator 1
158470722 20150515 Gladiator 1
我想创建一个列1或0,显示客户是否观看过《角斗士》,然后是1或0。我该怎么做
我创建了一个测试列,尝试使用“%Gladiator%”这样的简单名称,然后使用1或0。此解决方案的问题在于,如果客户已观看多次,它将不止一次显示1。我只需要1或0
我觉得我真的快要找到解决办法了。我对使用OVER和CASE非常陌生,但我很享受这种刺激:=所以你是这么说的:
SELECT Cust_Nr, Date, FilmName,
CASE WHEN FilmName LIKE '%Gladiator%' THEN 1 ELSE 0 END as WatchedGladiator
FROM YourTable
WHERE YourColumn = @somevalue
不起作用?因为根据你提供的数据,它应该是
编辑:
根据Tim的评论,我只想在查询中添加这一点
SELECT Cust_Nr, Date, FilmName, WatchedGladiator
FROM
(
SELECT Cust_Nr, Date, FilmName,
CASE WHEN FilmName LIKE '%Gladiator%' THEN 1 ELSE 0 END as WatchedGladiator
FROM YourTable
WHERE YourColumn = @somevalue
) as wg
WHERE WatchedGladiator = 1
尝试按客户/胶片级别分组:
select
cust_nbr,
case when film_name like '%Gladiator%' then 1 else 0 end
from
(
select
cust_nbr,
film_name
from
<your table>
group by
cust_nbr,
film_name
) t
或者,作为替代方案:
select distinct cust_nbr
from
<your table>
where
filmname = 'Gladiator'
所以,如果该客户观看了特定的电影,您希望按客户分组并添加一列 你可以做:
SELECT Cust_Nr, MAX(Watched_Gladiator)
FROM( SELECT Cust_Nr,
Watched_Gladiator = CASE WHEN EXISTS
(
SELECT 1 FROM CustomerFilm c2
WHERE c2.Cust_Nr = c1.Cust_Nr
AND c2.FilmName LIKE '%Gladiator%'
) THEN 1 ELSE 0 END
FROM CustomerFilm c1 ) X
GROUP BY Cust_Nr
但是,如果您使用客户表而不是此表,那么您就不需要分组方式了。以下内容满足您对所有电影的要求:
select r.*,
(case when row_number() over (partition by filmname order by date) = 1
then 1 else 0
end) as IsWatchedFirstAndGladiator
from results r;
仅限角斗士:
select r.*,
(case when filmname = 'Gladiator' and row_number() over (partition by filmname order by date) = 1
then 1 else 0
end) as IsWatchedFirst
from results r;
这似乎不是customer表,而是存储客户所观看内容的表。您必须使用customer表,然后不需要按Cust_Nr分组。OVER是一个窗口函数,与聚合/排名函数一起使用。我认为你不需要用cust_nbr和filmname的OVER at all group,然后在filmname='Gladiator'然后1 else 0结束时进行case。表中的值如何让人们假设事情,这很有趣。:=如果正确阅读,那么就没有问题。@dotn00b看看他提出的其他问题,然后选择。他们中的大多数人都是sameNo,他想知道每一位顾客是否看过一部包含《角斗士》的电影,但不一定在这部电影中。@TimSchmelter-我认为剪辑应该满足OP的基本要求。但要回答OP的另一个问题。这个问题不需要OVER。您好,我看到了关键字MAX,并找到了它:=Watched_Gladiator=MAXCASE当filmname像“%Gladiator%”时,然后是1,否则0结束。@dataaddicted-我很想看看您编写的最终查询。如果你能把它加入你的OP,那就太好了。