将重复的结果替换为空白

时间:2017-12-07 00:45:51

标签: sql-server

我希望从结果列表中省略重复的数据行。

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

2 个答案:

答案 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