根据SQL server中的几个条件返回值
我有一个简单的表,其中包含4列: 订单id是唯一的,不能为空 电影id,不能为空 租金\单位日期,不能为空 返回日期,可以为空 我正在尝试返回至少具有以下两个条件之一的所有电影ID: 只要退货日期不为空,同一部电影在同一日期订购了两次 同一部电影在返回的同一日期订购了2个不同的订单id-第一个电影id的租赁日期是第二个电影id的返回日期 该表如下所示:根据SQL server中的几个条件返回值,sql,sql-server,ssms,Sql,Sql Server,Ssms,我有一个简单的表,其中包含4列: 订单id是唯一的,不能为空 电影id,不能为空 租金\单位日期,不能为空 返回日期,可以为空 我正在尝试返回至少具有以下两个条件之一的所有电影ID: 只要退货日期不为空,同一部电影在同一日期订购了两次 同一部电影在返回的同一日期订购了2个不同的订单id-第一个电影id的租赁日期是第二个电影id的返回日期 该表如下所示: order_id movie_id rent_date return_date 1 1
order_id movie_id rent_date return_date
1 1 2014-07-17 NULL
2 1 2014-07-18 NULL
3 1 2014-07-19 2014-07-17
4 2 2014-07-17 2014-07-18
5 2 2014-07-17 2014-07-18
6 3 2014-07-17 NULL
7 3 2014-07-18 2014-07-19
我想返回以下电影ID:
电影id 1-因为订单1中的租赁日期与订单3中的归还日期匹配
电影id 2-因为它在订单id 4和订单id 5中具有相同的租赁日期
任何帮助都将不胜感激。您可以像下面这样尝试
select t1.rent_date,t1.movie_id from t t1 join t t2
on t1.rent_date=t2.return_date and t1.movie_id=t2.movie_id and t1.order_id!=t2.order_id
union
select t1.rent_date, t1.movie_id from t t1
where t1.return_date IS NOT NULL
group by t1.rent_date,t1.movie_id
having count(*)>1
创建简单表
declare @simple table
(
order_id int,
movie_id int,
rent_date date,
return_date date
)
还有一些简单的数据
insert into @simple values
(1, 1, '2014-07-17', NULL),
(2, 1, '2014-07-18', NULL),
(3, 1, '2014-07-19', '2014-07-17'),
(4, 2, '2014-07-17', '2014-07-18'),
(5, 2, '2014-07-17', '2014-07-18'),
(6, 3, '2014-07-17', NULL),
(7, 3, '2014-07-18', '2014-07-19')
询问
select distinct movie_id
from @simple t
where exists -- Rule 1
(
select rent_date
from @simple x
where return_date is not null
and movie_id = t.movie_id
group by rent_date
having count(*) = 2
)
or exists -- Rule 2
(
select *
from @simple x
where x.movie_id = t.movie_id
and x.rent_date = t.return_date
)
1只要退货日期不为空,同一部电影在同一日期订购了两次 这可以通过对电影id和租赁日期进行分组并添加COUNT*>=1的having参数来实现 2同一电影在返回的同一日期订购2个不同的订单id-第一个电影id的租赁日期是第二个电影id的返回日期 这可以通过将表本身连接起来并向join语句添加两个条件来实现。table1.movie\u id=table2.movie\u id和table1.rent\u date=table2.return\u date。还要添加两个订单ID应该不同 这将产生两个表,您可以在其中收集电影id和租赁日期。如果将这两个表合并为一个UNION而不是UNION ALL,则会得到唯一的结果 在我的脑海中,它会产生类似下面代码的结果
SELECT movie_id, rent_date
FROM movies table1
JOIN movies table2 ON tabele1.movie_id = table2.movie_id
AND tabele1.rent_date = tabele2.rent_date
GROUP BY movie_id, rent_date
HAVING COUNT(*) > 1
UNION
SELECT movie_id, rent_date
FROM movies table1
JOIN movies table2 ON tabele1.movie_id = table2.movie_id
AND tabele1.rent_date = tabele2.return_date
AND tabele1.order_id <> tabele2.order_id
GROUP BY movie_id, rent_date
要获取唯一的电影id,您可以将其用作CTE或内部查询,并在电影id、租赁日期添加分组依据。租赁日期可以晚于归还日期?抱歉,忘记提及。租金日期不能晚于归还日期-但可以相等。所以订单3是打字错误?是的,应该是2014-07-17或更早。很抱歉订单4和订单5建议您拥有电影2的两份副本,第一份在2014-07-17租赁,第二份在同一天租赁,第一份未归还。对吗?不能按一列分组并选择两列。租金日期必须在聚合函数内或在组中…我想我在半小时前已经更正了。。我想我必须再次编辑它:/在第一个查询中使用JOIN和GROUP是多余的。如果删除连接。同样,为什么在第二个查询中使用GROUP BY?工会将以任何方式消除所有重复数据。没错,。。。但我选择固执,不改变代码。。。再说一遍第二次查询需要并且返回的日期不是空的。规则1不需要这么复杂。表t已经有一行,表x只需要包含另一行。规则2需求和t.order\U id x.order\U id