2014-09-24 4 views
1

안녕하세요, 저는 복잡한 조건이 있습니다. 내가 가진 테이블 내가 즉, 유형 = '구매'현재 행을 기준으로 다음 행을 완료하십시오.

type = 'div'을하는 경우가 있어야 유형 = 'DIV'다음 행을 가진 행의 각 발생을 제거 할 '테스트'

ID Partner Type  Amount 
143854 CSTC Purchase -0.81 
144029 CSTC Purchase -0.69 
144030 CSTC Purchase -1.33 
144031 CSTC Purchase -0.47 
144032 CSTC Purchase -1.8 
149527 CSTC div   1574.48 
149528 CSTC Purchase -1574.48 
149531 CSTC div   867.53 
149532 CSTC Purchase -867.53 
149539 CSTC div   76.2 
149540 CSTC Purchase -76.2 
149550 CSTC div   8.77 
149551 CSTC Purchase -8.77 
149554 CSTC div   700.45 
149555 CSTC Purchase -700.45 

을 말할 수 다음 행 type = 'Purchase' 둘 다 삭제하십시오. type = 'div'을 갖는 행에서 일부 업데이트 작업을 수행하고 싶습니다.

나는 다음 행을 입력 할 수있는 리드를 시도했습니다. col 값을 입력하지만 도움이되지 않습니다.

select LEAD([Type]) OVER (ORDER BY ID) Next, ID, Partner,[Type],Amount from Test where date='9/18/2014' and ([Type] = 'div' or [Type] = 'Purchase') 
+1

SQL Server 2008은 없습니다. t 지원 LEAD() –

+0

SQL 서버 2012 –

+0

함께 시도했지만 그 질문에 태그가 ....... –

답변

0

밀러는 왼쪽 그것이

WITH TestWithRowNumber AS 
(
    SELECT *, 
    ROW_NUMBER() OVER (ORDER BY ID ASC) AS RowNumber 
    FROM Test 
) 
Select * 
    From TestWithRownumber FirstRow 
    join TestWithRownumber secondrow 
    on secondrow.RowNumber = firstrow.RowNumber + 1 
    and secondrow.type = 'Purchase' 
    and firstrow.type = 'div' 

에 관해서는 파괴 된 듯 삭제 명령문

WITH TestWithRowNumber AS 
(
    SELECT *, 
    ROW_NUMBER() OVER (ORDER BY ID ASC) AS RowNumber 
    FROM Test 
) 
delete Test 
    From TestWithRownumber FirstRow 
    join TestWithRownumber secondrow 
    on secondrow.RowNumber = firstrow.RowNumber + 1 
    and secondrow.type = 'Purchase' 
    and firstrow.type = 'div' 
    join test 
    on test.ID = FirstRow.ID 
    or test.ID = secondrow.ID 
0

표는 집합이며 집합에는 위에서 아래 또는 왼쪽에서 오른쪽 순서가 없음을 기억하십시오. 누군가가 type = div에 대한 행을 다시 삽입하면 어떻게 되나요? 그러나이 LEAD와

DECLARE @T TABLE (ID INT,[Partner] VARCHAR(10), [Type] VARCHAR(20),Amount decimal (10,2)) 
INSERT INTO @T 
VALUES 
(143854 ,'CSTC' , 'Purchase ', -0.81) 
,(144029 , 'CSTC' , 'Purchase' , -0.69) 
,(144030 , 'CSTC', 'Purchase' , -1.33) 
,(144031 , 'CSTC', 'Purchase' , -0.47) 
,(144032 , 'CSTC' , 'Purchase' , -1.8) 
,(149527 , 'CSTC' , 'div'  , 1574.48) 
,(149528 , 'CSTC' , 'Purchase' , -1574.48) 
,(149531 , 'CSTC' , 'div'  , 867.53) 
,(149532 , 'CSTC' , 'Purchase' , -867.53) 
,(149539 ,'CSTC', 'div'  , 76.2) 
,(149540 ,'CSTC' , 'Purchase' , -76.2) 
,(149550 , 'CSTC' , 'div'  , 8.77) 
,(149551 , 'CSTC' , 'Purchase' , -8.77) 
,(149554 , 'CSTC', 'div'  , 700.45) 
,(149555 , 'CSTC', 'Purchase' , -700.45) 


;with cte as 
(
select * 
,(SELECT TOP 1 Amount FROM @t WHERE ID > t.ID AND [type] = 'purchase' ORDER BY ID ASC) as nxt 
,(SELECT TOP 1 Amount FROM @t WHERE ID < t.ID AND [type] = 'div' ORDER BY ID DESC) AS pvs 
FROM @T T 
) 

DELETE FROM cte WHERE (Amount + nxt = 0) OR (Amount + pvs = 0) 

select * FROM @T 
+0

나는 그것을 점검 할 것이다. 감사합니다 –

+0

그것도 작동하지 않습니다. –

0

내 솔루션 작동 가능 여부를 확인하기 위해 아래의 코드를 시도 :

IF OBJECT_ID('Test1', 'U') IS NOT NULL 
    DROP TABLE Test1; 
go 

CREATE TABLE Test1 (ID  INTEGER NOT NULL 
,     Partner VARCHAR(100) NOT NULL 
,     Type VARCHAR(20) NOT NULL 
,     Amount FLOAT NOT NULL); 
go 

INSERT INTO Test1 (ID,  Partner, Type,  Amount ) 
VALUES   (143854, 'CSTC', 'Purchase', -0.81 ) 
,     (144029, 'CSTC', 'Purchase', -0.69 ) 
,     (144030, 'CSTC', 'Purchase', -1.33 ) 
,     (144031, 'CSTC', 'Purchase', -0.47 ) 
,     (144032, 'CSTC', 'Purchase', -1.8 ) 
,     (149527, 'CSTC', 'div  ', 1574.48 ) 
,     (149528, 'CSTC', 'Purchase', -1574.48) 
,     (149531, 'CSTC', 'div  ', 867.53 ) 
,     (149532, 'CSTC', 'Purchase', -867.53 ) 
,     (149539, 'CSTC', 'div  ', 76.2 ) 
,     (149540, 'CSTC', 'Purchase', -76.2 ) 
,     (149550, 'CSTC', 'div  ', 8.77 ) 
,     (149551, 'CSTC', 'Purchase', -8.77 ) 
,     (149554, 'CSTC', 'div  ', 700.45 ) 
,     (149555, 'CSTC', 'Purchase', -700.45 ) 
go 

WITH CTE_LEAD 
AS 
(
    SELECT LEAD([Type]) OVER (ORDER BY ID) NextType 
    ,  ID 
    ,  Partner 
    ,  [Type] 
    ,  Amount 
    from Test1 
) 
SELECT * 
FROM CTE_LEAD 
WHERE NextType = 'Purchase' AND Type = 'div'; 

WITH CTE_LEAD 
AS 
(
    SELECT LEAD([Type]) OVER (ORDER BY ID) NextType 
    ,  ID 
    ,  Partner 
    ,  [Type] 
    ,  Amount 
    from Test1 
) 
DELETE FROM Test1 
WHERE ID IN (
    SELECT ID 
    FROM CTE_LEAD 
    WHERE NextType = 'Purchase' AND Type = 'div' 
    UNION ALL 
    SELECT ID + 1 
    FROM CTE_LEAD 
    WHERE NextType = 'Purchase' AND Type = 'div' 
    ); 
+0

죄송합니다. –

관련 문제