根据SQL Server中的几种条件返回值

时间:2018-10-04 07:40:00

标签: sql sql-server ssms

我有一个简单的表,其中包含4列:

  1. 唯一的订单ID,不能为空
  2. 电影ID,不能为空
  3. rent_date,不能为空
  4. 返回日期,可以为空

我正在尝试返回至少具有以下两个条件之一的所有电影ID:

  1. 同一部电影在同一日期订购了两次(只要返回日期不为空)
  2. 订购同一部电影的日期与返回的日期相同(2个不同的订购ID-第一个电影ID的租用日期是第二个电影ID的返还日期)

该表如下所示:

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的租期相同

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

您可以尝试以下操作

    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

答案 1 :(得分:0)

创建简单表

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
    )

答案 2 :(得分:0)

1)同一部电影在同一日期订购了两次(只要返回日期不为空)

这可以通过将movie-id和rent-date分组并添加hading参数(HAVING COUNT(*)> = 1)来完成

2)同一部电影的订购日期与返回的日期相同(2个不同的订购ID-第一个电影ID的租借日期是第二个电影ID的返还日期)

这可以通过将表本身连接起来并将两个条件添加到join语句中来完成。 tabele1.movi​​e_id = table2.movi​​e_id和tabele1.rent_date = tabele2.return_date。还应添加两个订单ID应该不同

这将产生两个表,您可以在其中收集movie_id和rent-date。如果将两个表与一个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

要获取唯一的movie-id,您可以将其用作CTE或内部查询,并在movie_id,rent_date上添加GROUP BY。