Sql server 2008 如何消除重复行?
这是我的表格结构: 1当我使用此查询时:Sql server 2008 如何消除重复行?,sql-server-2008,Sql Server 2008,这是我的表格结构: 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 n
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
一切正常,如下所示:
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
我有额外的行,它如下所示:
这是T_TicketPrint表中的已售出门票。当车票处于卖出状态3时,可以打印出状态10。重要的是,当我们打印车票时,每次都会生成新的条形码。在这种情况下,我们有一张票被售出并打印了3次,带有3个不同的条形码
TicketBarCode列中的其他值应为空:
如何去掉多余的行
这是最终正确的脚本:
);使用cte1
选择T_ActionTicketLog.ActionTicketID、T_ActionTicketLog.TicketOrderID、T_ActionTicketLog.StatusID、T_ActionTicketLog.Created,
状态ID为3、10和1时的情况
其他0
终止
*按T_ActionTicketLog.ActionTicketID划分的分区上的行数,按T_ActionTicketLog.StatusID排序按T_ActionTicketLog.Created作为rn
来自T_ActionTicketLog
T_ActionTicketLog.TicketOrderID=T_OrderTicket.ID上的左外部联接T_OrderTicket
,
cte2
选择ActionTicketID、OrderTicketID、TicketBarCode、,
按ActionTicketID创建为rn的分区上的行数
从T_TicketPrint
选择c1.ActionTicketID、c1.StatusID、oa.TicketBarCode
来自cte1 c1
外部应用选择*
来自cte2 c2
其中c1.ActionTicketID=c2.ActionTicketID和c1.TicketOrderID=c2.OrderTicketID和c1.rn=c2.rn
骨性关节炎
其中c1.ActionTicketID=24014999
按c1订购。已创建如果我没弄错,您需要应用于第一对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
乌普图特:
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
您是否尝试在第二次加入中添加和dbo.T_ActionTicketLog.StatusID=3或dbo.T_ActionTicketLog.StatusID=10?@tesicg,回答我们向您提出的问题,而不是开始新的问题。我重复我的问题:为什么第11、12行有197797471545,而第14、15行有197797473537?为什么不反过来呢?11, 12 197797473537; 14, 15 197797471545? 逻辑是什么?可能是@stb的重复:在这种情况下,状态2和6不会重复,这很好,但3和10仍在重复。@Giorgi Nakuri:这里解释得更好。上一个脚本中有很多错误。我不能运行它。我可以把条件放在哪里:ActionTicketID=24014999?您没有提供任何表结构。我闭着眼睛写代码。你期待什么?试着改正错误。或者把这些错误写在这里。我们不是万加斯。你可以把它放在最后。这里c1.ActionTicketID=24014999请看一下我更正的原始帖子。你更正了什么?我看不出有什么变化。我在这里做了一些改变。一切都在上面。