Sql server 如何解决以下SQL查询?

Sql server 如何解决以下SQL查询?,sql-server,ssms,Sql Server,Ssms,我有五个名为[User]、[UserCard]、[Card]、[CardType]和[Transaction]的表。这些表中存储的数据分别从上到下显示 现在我想运行以下查询: 对于每种卡类型,显示交易总额大于6000的卡的总数。 以下是表和数据的sql代码: go create table [User]( [userId] int primary key, [name] varchar(20) not null, [phoneNum] varchar(15) not null, [city]

我有五个名为[User]、[UserCard]、[Card]、[CardType]和[Transaction]的表。这些表中存储的数据分别从上到下显示

现在我想运行以下查询:

对于每种卡类型,显示交易总额大于6000的卡的总数。 以下是表和数据的sql代码:

go

create table [User](
[userId] int primary key,
[name] varchar(20) not null,
[phoneNum] varchar(15) not null,
[city] varchar(20) not null
)
go

create table CardType(
[cardTypeID] int primary key,
[name] varchar(15),
[description] varchar(40) null
)
go
create Table [Card](
cardNum Varchar(20) primary key,
cardTypeID int foreign key references  CardType([cardTypeID]),
PIN varchar(4) not null,
[expireDate] date not null,
balance float not null
)
go


Create table UserCard(
userID int foreign key references [User]([userId]),
cardNum varchar(20) foreign key references [Card](cardNum),
primary key(cardNum)
)
go
create table [Transaction](
transId int primary key,
transDate date not null,
cardNum varchar(20) foreign key references [Card](cardNum),
amount int not null
)


INSERT [dbo].[User] ([userId], [name], [phoneNum], [city]) VALUES (1, N'Ali', N'03036067000', N'Narowal')
GO
INSERT [dbo].[User] ([userId], [name], [phoneNum], [city]) VALUES (2, N'Ahmed', N'03036047000', N'Lahore')
GO
INSERT [dbo].[User] ([userId], [name], [phoneNum], [city]) VALUES (3, N'Aqeel', N'03036063000', N'Karachi')
GO
INSERT [dbo].[User] ([userId], [name], [phoneNum], [city]) VALUES (4, N'Usman', N'03036062000', N'Sialkot')
GO
INSERT [dbo].[User] ([userId], [name], [phoneNum], [city]) VALUES (5, N'Hafeez', N'03036061000', N'Lahore')
GO


INSERT [dbo].[CardType] ([cardTypeID], [name], [description]) VALUES (1, N'Debit', N'Spend Now, Pay Now')
GO
INSERT [dbo].[CardType] ([cardTypeID], [name], [description]) VALUES (2, N'Credit', N'Spend Now, Pay later')
GO

INSERT [dbo].[Card] ([cardNum], [cardTypeID], [PIN], [expireDate], [balance]) VALUES (N'1234', 1, N'1770', CAST(N'2022-07-01' AS Date), 43025.31)
GO
INSERT [dbo].[Card] ([cardNum], [cardTypeID], [PIN], [expireDate], [balance]) VALUES (N'1235', 1, N'9234', CAST(N'2020-03-02' AS Date), 14425.62)
GO
INSERT [dbo].[Card] ([cardNum], [cardTypeID], [PIN], [expireDate], [balance]) VALUES (N'1236', 1, N'1234', CAST(N'2019-02-06' AS Date), 34325.52)
GO
INSERT [dbo].[Card] ([cardNum], [cardTypeID], [PIN], [expireDate], [balance]) VALUES (N'1237', 2, N'1200', CAST(N'2021-02-05' AS Date), 24325.3)
GO
INSERT [dbo].[Card] ([cardNum], [cardTypeID], [PIN], [expireDate], [balance]) VALUES (N'1238', 2, N'9004', CAST(N'2020-09-02' AS Date), 34025.12)
GO

INSERT [dbo].[UserCard] ([userID], [cardNum]) VALUES (1, N'1234')
GO
INSERT [dbo].[UserCard] ([userID], [cardNum]) VALUES (1, N'1235')
GO
INSERT [dbo].[UserCard] ([userID], [cardNum]) VALUES (2, N'1236')
GO
INSERT [dbo].[UserCard] ([userID], [cardNum]) VALUES (3, N'1238')
GO
Insert  [dbo].[UserCard] ([userID], [cardNum]) VALUES (4, N'1237')

INSERT [dbo].[Transaction] ([transId], [transDate], [cardNum], [amount]) VALUES (1, CAST(N'2017-02-02' AS Date), N'1234', 500)
GO
INSERT [dbo].[Transaction] ([transId], [transDate], [cardNum], [amount]) VALUES (2, CAST(N'2018-02-03' AS Date), N'1235', 3000)
GO
INSERT [dbo].[Transaction] ([transId], [transDate], [cardNum], [amount]) VALUES (3, CAST(N'2017-05-06' AS Date), N'1236', 2500)
GO
INSERT [dbo].[Transaction] ([transId], [transDate], [cardNum], [amount]) VALUES (4, CAST(N'2016-09-09' AS Date), N'1238', 2000)
GO
INSERT [dbo].[Transaction] ([transId], [transDate], [cardNum], [amount]) VALUES (5, CAST(N'2015-02-10' AS Date), N'1234', 6000)
GO


Select * from [User]
Select * from UserCard
Select * from [Card]
Select * from CardType
Select * from [Transaction]
我可以使用连接函数、聚合函数和分组函数。我尝试了几个查询,但无法获得预期的输出。此处显示了预期的输出

产生这种预期输出的原因是,只有一张卡号为1234的借记卡进行了超过6000笔的交易。而且没有一张信用卡的交易额超过6000笔。 请指导我如何查询以获得预期的输出。
谢谢。

任何子查询和分组都无法修复

享受:)


我希望这对你有用:

select t1.cardTypeID, t1.name,
    ISNULL((
    select count(distinct t2.cardNum)
    from Card t2
    join Transactions t3 on t3.cardNum = t2.cardNum
    where t2.cardTypeID = t1.cardTypeID
    group by t2.cardNum
    having sum(t3.amount) > 6000
    ), 0) as NumberOfCards
from CardType t1
group by t1.cardTypeID, t1.name

事务表中的事务数不超过6000。所以你需要澄清你的问题陈述。此外,不建议使用“用户”和“交易”等表名。是的,没有超过6000的单笔交易,但卡号为1234(即阿里)的用户集体完成了6000+500=6500的交易。因此,我所附的预期输出图像显示,有一张借记卡已经完成了超过6000笔的交易。有0张信用卡的交易量超过6000张。这得到了正确的答案,但可能是因为错误的原因——我认为你不应该选择cardTypeID作为卡数!假设cardTypeID不是1和2,而是Alpha,那么此查询将不起作用。:)@谢谢你指出这一点。我已经做了改变。很高兴听到:)
select t1.cardTypeID, t1.name,
    ISNULL((
    select count(distinct t2.cardNum)
    from Card t2
    join Transactions t3 on t3.cardNum = t2.cardNum
    where t2.cardTypeID = t1.cardTypeID
    group by t2.cardNum
    having sum(t3.amount) > 6000
    ), 0) as NumberOfCards
from CardType t1
group by t1.cardTypeID, t1.name