我非常简单。不知道如何用文字描述它,所以我会用图像来做。
表格服务
PERSONID Service_id chargeamount
1 3 20.50
2 4 80.50
3 5 78.80
表费用
service_id payed extracharges
3 true 20.50
4 true 80.50
3 false 78.80
如果有任何未计费的额外费用,则必须显示true或false,如果服务ID在第二个表中不匹配,则必须在查询中显示空值或其他计算值
像这样的东西
PERSONID Service_id chargeamount payed
1 3 20.50 false
2 4 80.50 true
3 5 78.80 null
但不允许使用与连接创建的行相同的行。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[SERVICES](
[personid] [int] NULL,
[service_id] [int] NULL,
[chargeamount] [float] NULL
) ON [PRIMARY]
GO
insert into services (personid,service_id,chargeamount) values ( 1,3 ,20);
insert into services (personid,service_id,chargeamount) values ( 2,4 ,20);
insert into services (personid,service_id,chargeamount) values ( 3,5 ,20);
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[charges](
[payed] [bit] NULL,
[service_id] [int] NULL,
[extracharges] [float] NULL
) ON [PRIMARY]
GO
insert into services (service_id,payed,extracharges) values ( 3,true,20.50);
insert into services (service_id,payed,extracharges) values ( 3,false,78.80);
insert into services (service_id,payed,extracharges) values ( 4,false,80.50);
答案 0 :(得分:0)
这是service_id
上的简单左连接。当至少有一行payed
= false
时,会显示false
。否则,将分别显示true
或null
。
select s.*, case min(c.payed) when 1 then 'true' when 0 then 'false' else 'null' end
from services s
left join charges c on c.service_id = s.service_id
group by s.personid, s.service_id, s.chargeamount