Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据SQL server中的几个条件返回值_Sql_Sql Server_Ssms - Fatal编程技术网

根据SQL server中的几个条件返回值

根据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

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

订单id是唯一的,不能为空 电影id,不能为空 租金\单位日期,不能为空 返回日期,可以为空 我正在尝试返回至少具有以下两个条件之一的所有电影ID:

只要退货日期不为空,同一部电影在同一日期订购了两次 同一部电影在返回的同一日期订购了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中具有相同的租赁日期 任何帮助都将不胜感激。

您可以像下面这样尝试

    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