如何摆脱重复的行?

时间:2015-03-25 10:42:35

标签: sql-server-2008

这是我的表结构:

enter image description here

1)当我使用此查询时:

SELECT  T_ActionTicketLog.ActionTicketID, T_ActionTicketLog.StatusID
      --,case when (dbo.T_ActionTicketLog.StatusID <> 2 and dbo.T_ActionTicketLog.StatusID <> 6) then dbo.T_TicketPrint.TicketBarCode
      --else null end as TicketBarCode
FROM       T_ActionTicketLog
      LEFT OUTER JOIN T_OrderTicket ON T_ActionTicketLog.TicketOrderID = T_OrderTicket.ID
      --LEFT OUTER JOIN T_TicketPrint ON T_OrderTicket.ActionTicketID = T_TicketPrint.ActionTicketID and T_OrderTicket.ID = T_TicketPrint.OrderTicketID
where T_ActionTicketLog.ActionTicketID = 24014999

一切正常,看起来如下:

enter image description here

2)但是,当我使用此查询时因为我需要T_TicketPrint.TicketBarCode:

SELECT  T_ActionTicketLog.ActionTicketID, T_ActionTicketLog.StatusID
      ,case when (dbo.T_ActionTicketLog.StatusID <> 2 and dbo.T_ActionTicketLog.StatusID <> 6) then dbo.T_TicketPrint.TicketBarCode
      else null end as TicketBarCode
FROM       T_ActionTicketLog
      LEFT OUTER JOIN T_OrderTicket ON T_ActionTicketLog.TicketOrderID = T_OrderTicket.ID
      LEFT OUTER JOIN T_TicketPrint ON T_OrderTicket.ActionTicketID = T_TicketPrint.ActionTicketID and T_OrderTicket.ID = T_TicketPrint.OrderTicketID
where T_ActionTicketLog.ActionTicketID = 24014999

我有额外的行,看起来如下:

enter image description here

这里我们在T_TicketPrint表中有售票。售票时(状态3)可以打印出来(状态10)。重要的是当我们每次生成新的条形码时打印票证。在这种情况下,我们有一张售完的票,并用3种不同的条形码打印出3次。

所需的结果(TicketBarCode列中的其他值应为NULL):

enter image description here

如何摆脱额外的行?

这是最终正确的脚本:

;使用cte1 AS(SELECT T_ActionTicketLog.ActionTicketID,T_ActionTicketLog.TicketOrderID,T_ActionTicketLog.StatusID,T_ActionTicketLog.Created, 状态IN IN(3,10)然后1 ELSE 0 结束 * ROW_NUMBER()OVER(T_ActionTicketLog.ActionTicketID,T_ActionTicketLog.StatusID ORDER BY T_ActionTicketLog.Created) 来自T_ActionTicketLog LEFT OUTER JOIN T_OrderTicket ON T_ActionTicketLog.TicketOrderID = T_OrderTicket.ID ) CTE2 AS(SELECT ActionTicketID,OrderTicketID,TicketBarCode, ROW_NUMBER()OVER(由ActionTicketID ORDER BY创建的PARTITION)AS rn 来自T_TicketPrint ) SELECT c1.ActionTicketID,c1.StatusID,oa.TicketBarCode 来自cte1 c1 外部申请(选择* 来自cte2 c2 WHERE c1.ActionTicketID = c2.ActionTicketID AND c1.TicketOrderID = c2.OrderTicketID AND c1.rn = c2.rn )oa 其中c1.ActionTicketID = 24014999 按c1.Created排序

1 个答案:

答案 0 :(得分:0)

如果我找到了你,你需要申请第一对(3,10)第一个条形码,第二个条形码到第二对,依此类推。但目前尚不清楚这些对中的哪一对是第一对还是第二对。

这是测试脚本:

DECLARE @actions TABLE
    (
      TicketID INT ,
      StatusID INT
    )
DECLARE @prints TABLE
    (
      TicketID INT ,
      BarCode NVARCHAR(MAX)
    )

INSERT  INTO @actions
VALUES  ( 1, 2 ),
        ( 1, 4 ),
        ( 1, 3 ),
        ( 1, 10 ),
        ( 1, 6 ),
        ( 1, 3 ),
        ( 1, 10 ),
        ( 1, 6 ),
        ( 1, 3 ),
        ( 1, 10 ),
        ( 1, 6 ),
        ( 1, 7 )


INSERT  INTO @prints
VALUES  ( 1, 'C1' ),
        ( 1, 'C2' ),
        ( 1, 'C3' );
WITH    cte1
          AS ( SELECT   * ,
                        CASE WHEN StatusID IN ( 3, 10 ) THEN 1
                             ELSE 0
                        END
                        * ROW_NUMBER() OVER ( PARTITION BY TicketID, StatusID ORDER BY StatusID ) AS rn
               FROM     @actions a
             ),
        cte2
          AS ( SELECT   * ,
                        ROW_NUMBER() OVER ( PARTITION BY TicketID ORDER BY BarCode ) AS rn
               FROM     @prints a
             )
    SELECT  c1.TicketID ,
            c1.StatusID ,
            oa.BarCode
    FROM    cte1 c1
            OUTER APPLY ( SELECT    *
                          FROM      cte2 c2
                          WHERE     c1.TicketID = c2.TicketID
                                    AND c1.rn = c2.rn
                        ) oa

Ouptut:

TicketID    StatusID    BarCode
1           2           NULL
1           3           C1
1           3           C2
1           3           C3
1           4           NULL
1           6           NULL
1           6           NULL
1           6           NULL
1           7           NULL
1           10          C1
1           10          C2
1           10          C3

类似的东西:

;WITH    cte1
          AS ( SELECT    T_ActionTicketLog.ActionTicketID, T_ActionTicketLog.OrderTicketID, T_ActionTicketLog.StatusID ,
                        CASE WHEN StatusID IN ( 3, 10 ) THEN 1
                             ELSE 0
                        END
                        * ROW_NUMBER() OVER ( PARTITION BY T_ActionTicketLog.ActionTicketID, T_ActionTicketLog.StatusID ORDER BY T_ActionTicketLog.Created ) AS rn
               FROM       T_ActionTicketLog
               LEFT OUTER JOIN T_OrderTicket ON T_ActionTicketLog.TicketOrderID = T_OrderTicket.ID
             ),

    cte2
      AS ( SELECT   ActionTicketID , OrderTicketID, TicketBarCode
                    ROW_NUMBER() OVER ( PARTITION BY ActionTicketID ORDER BY Created ) AS rn
           FROM     T_TicketPrint
         )
SELECT  c1.ActionTicketID, c1.StatusID , oa.TicketBarCode
FROM    cte1 c1
        OUTER APPLY ( SELECT    *
                      FROM      cte2 c2
                      WHERE     c1.ActionTicketID = c2.ActionTicketID AND c1.ID = c2.OrderTicketID AND c1.rn = c2.rn
                    ) oa