我被这个问题困住了。这是我的设想。我有两个表,一个是user,另一个是transaction。
用户表
Id Name Email
1 user1 user1@example.com
2 user2 user2@example.com
3 user3 user3@example.com
4 user4 user4@example.com
5 user5 user5@example.com
事务处理表
Id UserId Credit Debit Description DateAdded
1 1 10.00 0.00 Add-Cash 2020-05-19 00:00:00.000
2 2 0.00 15.00 Buy Course XYZ 2020-04-01 00:00:00.000
3 3 0.00 20.00 Buy Course ABC 2020-05-15 00:00:00.000
4 4 0.00 15.00 Buy Course IJK 2020-05-01 00:00:00.000
我需要获取过去30天内没有购买任何课程的用户列表。所以我需要在查询中使用where子句。我使用了where子句,但没有得到预期的结果。
下面是我的预期输出。
Id Name Email
1 user1 user1@example.com
2 user2 user2@example.com
5 user5 user5@example.com
下面是我要做的得到输出
SELECT U.Id, U.Name, U.Email FROM [User] U
LEFT JOIN [Transaction] T ON U.Id=T.UserId
WHERE T.Description LIKE '%Buy Course%'
GROUP BY U.Id, U.Name, U.Email
HAVING MAX(T.DateAdded) <= (GETDATE()-30)
下面是表的脚本
create database Test
use Test
create table [User]
(
[Id] int,
[Name] nvarchar(50),
[Email] nvarchar(50)
)
create table [Transaction]
(
[Id] int,
[UserId] int,
[Credit] decimal(18,2),
[Debit] decimal(18,2),
[Description] nvarchar(100),
[DateAdded] datetime
)
insert into [User](Id, Name, Email) values(1,'user1','user1@example.com');
insert into [User](Id, Name, Email) values(2,'user2','user2@example.com');
insert into [User](Id, Name, Email) values(3,'user3','user3@example.com');
insert into [User](Id, Name, Email) values(4,'user4','user4@example.com');
insert into [User](Id, Name, Email) values(5,'user5','user5@example.com');
insert into [Transaction](Id, UserId, Credit, Debit, Description, DateAdded) values(1, 1, 10.00, 0.00, 'Add-Cash', '2020-05-19 00:00:00.000');
insert into [Transaction](Id, UserId, Credit, Debit, Description, DateAdded) values(2, 2, 0.00, 15.00, 'Buy Course XYZ', '2020-04-01 00:00:00.000');
insert into [Transaction](Id, UserId, Credit, Debit, Description, DateAdded) values(3, 3, 0.00, 20.00, 'Buy Course ABC', '2020-05-15 00:00:00.000');
insert into [Transaction](Id, UserId, Credit, Debit, Description, DateAdded) values(4, 4, 0.00, 15.00, 'Buy Course IJK', '2020-05-01 00:00:00.000');
2条答案
按热度按时间qoefvg9y1#
我需要获取过去30天内没有购买任何课程的用户列表。所以我需要在查询中使用where子句。
在你的数据中,“买了任何课程”是什么意思还不清楚。大概是和
where
查询中的子句。基本思想是
not exists
:这是一把小提琴。注意,它将表名更改为
users
以及transactions
因此它们不会与SQLServer保留字冲突。您可以修改
where
如果您对“买了一门课程”的定义不同,请在子查询中添加子句。pobjuy322#
您可以使用not exists或左连接并签入连接以获取空值,如下所示
在这里,我们连接要排除的项,然后获取所有未连接的行。我用的是你发布的标准。