我希望从结果列表中省略重复的数据行。
declare @Table1 TABLE(
ID int not null,
OrderNo varchar(5) not null)
declare @Table2 TABLE(
OrderID int not null,
Invoice varchar(7) not null)
declare @Table3 TABLE(
OrderID int not null,
Payment varchar(7) not null)
insert into @Table1 values (1,'14598'),(2,'14599'),(3,'14600'),(4,'14601')
insert into @Table2 values (1,'35.01'),(1,'396.90'),(1,'79.00'),(2,'786.20'),(3,'40.00'),(3,'93.60'),(3,'43.60'),(4,'15.08')
insert into @Table3 values (1,'20.50'),(1,'180.00'),(2,'786.20'),(2,'15.20'),(2,'186.20'),(3,'40.00'),(3,'93.60'),(3,'43.60'),(4,'15.08')
select t1.ID, t2.Invoice, t3.Payment from @Table1 t1
join @Table2 t2 on t2.OrderID = t1.ID
join @Table3 t3 on t3.OrderID = t1.ID
表格数据:
Table1
ID | OrderNo
-------------
1 | 14598
2 | 14599
3 | 14600
4 | 14601
Table2
OrderID | Invoice
------------------
1 | 35.01
1 | 396.90
1 | 79.00
2 | 786.20
3 | 40.00
3 | 93.60
3 | 43.60
4 | 15.08
Table3
OrderID | Payment
-----------------
1 | 20.50
1 | 180.00
2 | 786.20
2 | 15.20
2 | 186.20
3 | 40.00
3 | 93.60
3 | 43.60
4 | 15.08
当我尝试将所有这三个表连接在一起时,我得到以下内容:
ID | Invoice | Payment
----------------------
1 | 35.01 | 20.50
1 | 35.01 |180.00
1 | 396.90 | 20.50
1 | 396.90 |180.00
1 | 79.00 | 20.50
1 | 79.00 |180.00
2 | 786.20 |786.20
2 | 786.20 | 15.20
2 | 786.20 |186.20
3 | 40.00 | 40.00
3 | 40.00 | 93.60
3 | 40.00 | 43.60
3 | 93.60 | 40.00
3 | 93.60 | 93.60
3 | 93.60 | 43.60
3 | 43.60 | 40.00
3 | 43.60 | 93.60
3 | 43.60 | 43.60
4 | 15.08 | 15.08
现在您可以看到,订单2在表2中只有一张发票,但在表3中有3笔付款。我想显示3行,每个付款单独一行,但我不希望它在每个后续行重复单个发票。
随后在订单1中,表2中有3个发票,但表3中只有2个付款。目前,它显示了Table2中表2中每个条目的所有内容,结果是6行而不是3行。
我只想报告每个金额一次,后续行(如果由于超过另一个表中的结果数而生成)显示空白。选择DISTINCT无法实现此目的。有没有办法实现我在这里的目标?
ID | Invoice | Payment
----------------------
1 | 35.01 | 20.50
1 | 396.90 | 180.00
1 | 79.00 |
2 | 786.20 | 786.20
2 | | 15.20
2 | | 186.20
答案 0 :(得分:0)
declare @Table1 TABLE(
ID int not null,
OrderNo varchar(5) not null)
declare @Table2 TABLE(
OrderID int not null,
Invoice varchar(7) not null)
declare @Table3 TABLE(
OrderID int not null,
Payment varchar(7) not null)
insert into @Table1 values (1,'14598'),(2,'14599'),(3,'14600'),(4,'14601')
insert into @Table2 values (1,'35.01'),(1,'396.90'),(1,'79.00'),(2,'786.20'),(3,'40.00'),(3,'93.60'),(3,'43.60'),(4,'15.08')
insert into @Table3 values (1,'20.50'),(1,'180.00'),(2,'786.20'),(2,'15.20'),(2,'186.20'),(3,'40.00'),(3,'93.60'),(3,'43.60'),(4,'15.08')
select isnull(t2.OrderID,t3.OrderID) AS ID,t2.Invoice,
t3.Payment
from
@Table1 t1
join (select *,Row_number()over(partition by OrderID order by (select 1))rn from @Table2) t2 on t2.OrderID = t1.ID
full join
(select *,Row_number()over(partition by OrderID order by (select 1))rn2 from @Table3) t3
on t3.OrderID = t2.OrderID and t2.rn=t3.rn2 ;
----------------------
ID Invoice Payment
-----------------------
1 35.01 20.50
1 396.90 180.00
1 79.00 NULL
2 786.20 786.20
2 NULL 15.20
2 NULL 186.20
3 40.00 40.00
3 93.60 93.60
3 43.60 43.60
4 15.08 15.08
答案 1 :(得分:0)
你也可以使用如下所示的派生表或CTE
WITH CTE AS(
select t1.ID,
t2.Invoice,
t3.Payment,
ROW_NUMBER() OVER (PARTITION BY t1.ID,t2.Invoice ORDER BY t1.ID ) RN
from @Table1 t1
join @Table2 t2 on t2.OrderID = t1.ID
join @Table3 t3 on t3.OrderID = t1.ID
)
select ID,
CASE WHEN RN > 1 THEN NULL ELSE Invoice END,
Payment
FROM CTE