获取非活动用户的查询

lvjbypge  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(247)

我被这个问题困住了。这是我的设想。我有两个表,一个是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');
qoefvg9y

qoefvg9y1#

我需要获取过去30天内没有购买任何课程的用户列表。所以我需要在查询中使用where子句。
在你的数据中,“买了任何课程”是什么意思还不清楚。大概是和 where 查询中的子句。
基本思想是 not exists :

select u.*
from users u
where not exists (select 1
                  from transactions t
                  where t.userid = u.id and and
                        t.Description like '%Buy Course%' and
                        t.dateadded > dateadd(day, -30, getdate())
                 );

这是一把小提琴。注意,它将表名更改为 users 以及 transactions 因此它们不会与SQLServer保留字冲突。
您可以修改 where 如果您对“买了一门课程”的定义不同,请在子查询中添加子句。

pobjuy32

pobjuy322#

您可以使用not exists或左连接并签入连接以获取空值,如下所示

SELECT DISTINCT users.id, users.name, users.email
FROM USERS
LEFT JOIN TRANSACTIONS AS T ON USERS.ID = T.USERID 
       AND T.Description LIKE 'Buy Course%'
       AND T.DateAdded >= DATEADD(day,-30, GETDATE())
WHERE T.USERID IS NULL

在这里,我们连接要排除的项,然后获取所有未连接的行。我用的是你发布的标准。

相关问题