2012-02-02 20 views
-1

如果有任何子標記爲已付款,我需要更新付費列中的重複值;然後更新其它子與同一客戶在oracle/sql中有條件地更新重複值

下面是示例數據:

DATE Event_ID EVENT CUSTOMER SUBSCRIBER Paid 
01/24/2011 3513709 Play 1 41285030 38803277 Y 
01/24/2011 3513709 Play 1 41285030 45051523 N 
01/24/2011 3513709 Play 1 41285030 45051523 Y 
01/25/2011 3527194 Play 2 45568242 43673464 Y 
01/25/2011 3527194 Play 2 45568242 45023437 N 
02/03/2011 3622935 Play 3 19356414 43546915 Y 
02/03/2011 3622935 Play 3 19356414 44981229 N 
02/07/2011 3674946 Play 4 41240152 38744274 Y 
02/07/2011 3674946 Play 4 41240152 44225340 Y 
02/07/2011 3674946 Play 4 41240152 44820829 N 
03/10/2011 4094832 Play 5 31485304 33260562 Y 
03/10/2011 4094832 Play 5 31485304 43922788 Y 
03/10/2011 4094832 Play 5 31485304 45022503 N 
03/10/2011 4094832 Play 5 31485304 45022503 Y 
03/10/2011 4094833 Play 6 31485304 33260562 N 
03/10/2011 4094833 Play 6 31485304 43922788 N 
03/10/2011 4094833 Play 6 31485304 45022503 N 
03/16/2011 4167371 Play 7 19384295 32940366 Y 
03/16/2011 4167371 Play 7 19384295 45002390 N 
03/17/2011 4179070 Play 8 36882841 38554357 Y 
03/17/2011 4179070 Play 8 36882841 44988521 N 

希望的輸出應該是這樣的:

DATE Event_ID EVENT CUSTOMER SUBS Paid 
01/24/2011 3513709 Play 1 41285030 38803277 Y 
01/24/2011 3513709 Play 1 41285030 45051523 Y 
01/24/2011 3513709 Play 1 41285030 45051523 Y 
01/25/2011 3527194 Play 2 45568242 43673464 Y 
01/25/2011 3527194 Play 2 45568242 45023437 Y 
02/03/2011 3622935 Play 3 19356414 43546915 Y 
02/03/2011 3622935 Play 3 19356414 44981229 Y 
02/07/2011 3674946 Play 4 41240152 38744274 Y 
02/07/2011 3674946 Play 4 41240152 44225340 Y 
02/07/2011 3674946 Play 4 41240152 44820829 Y 
03/10/2011 4094832 Play 5 31485304 33260562 Y 
03/10/2011 4094832 Play 5 31485304 43922788 Y 
03/10/2011 4094832 Play 5 31485304 45022503 Y 
03/10/2011 4094832 Play 5 31485304 45022503 Y 
03/10/2011 4094833 Play 6 31485304 33260562 N 
03/10/2011 4094833 Play 6 31485304 43922788 N 
03/10/2011 4094833 Play 6 31485304 45022503 N 
03/16/2011 4167371 Play 7 19384295 32940366 Y 
03/16/2011 4167371 Play 7 19384295 45002390 Y 
03/17/2011 4179070 Play 8 36882841 38554357 Y 
03/17/2011 4179070 Play 8 36882841 44988521 Y 
+0

以前用EXCEL做的工作看,如果有人可以幫助獲得SQL查詢。 – 2012-02-02 20:16:54

+0

是否需要檢查相同的EVENT和SUBSCRIBER以及客戶? – msmucker0527 2012-02-02 20:23:01

+0

在Excel中,我用來檢查客戶是否被收費的事件通過一個subd其他潛艇與同一客戶suld被視爲支付我希望它可以幫助 – 2012-02-02 20:47:43

回答

1

的這個主旨是

  • 與付費訂閱的所有客戶創建子查詢
  • JOIN這個子選擇回到你的實際的表上afformentioned客戶
  • 使用此結果UPDATE條款
  • 只更新付費在爲N

SQL語句

UPDATE YourTable 
SET  Paid = 'Y' 
FROM YourTable t 
     INNER JOIN (
      SELECT Customer 
      FROM YourTable 
      WHERE Paid = 'y' 
     ) c ON c.Customer = t.Customer 
WHERE Paid = 'N' 
0

最簡單的方式做到這一點是一個天真的子查詢:

update events set paid = 'Y' where event_id in (
    select event_id from events where paid = 'Y' 
) 
+0

它的工作,但遇到了其他問題此查詢也更新記錄,其中event_id是相同的但顧客是不同的。結果我正在尋找重複的event_ids,並且只在客戶相同的情況下更新付費列 – 2012-02-03 14:41:35

+0

然後,您應該在您的問題中解釋這一點。下次請多加努力。 – beerbajay 2012-02-03 15:28:13

0
WITH CTE AS (
    SELECT [Event], [Customer], SUM(CASE Paid WHEN 'Y' THEN 1 ELSE 0 END) [Sum] 
    FROM tmpTbl 
    GROUP BY [EVENT], Customer) 

UPDATE tmpTbl SET [Paid] = 'Y' 
FROM tmpTbl JOIN CTE AS tbl ON tmpTbl.[Event] = tbl.[Event] AND tmpTbl.[Customer] = tbl.[Customer] AND tbl.[Sum] > 0 

的樣本數據腳本

SELECT * INTO tmpTbl FROM (
SELECT GETDATE() -1 [DATE] ,3513709 [Event_ID],'Play 1' [Event],41285030 [CUSTOMER],38803277 [SUBSCRIBER],'Y' [PAID] UNION 
SELECT GETDATE() -1 [DATE] ,3513709 [Event_ID],'Play 1' [Event],41285030 [CUSTOMER],45051523 [SUBSCRIBER],'N' [PAID] UNION 
SELECT GETDATE() -1 [DATE] ,3513709 [Event_ID],'Play 1' [Event],41285030 [CUSTOMER],45051523 [SUBSCRIBER],'Y' [PAID] UNION 

SELECT GETDATE() -2 [DATE] ,3527194 [Event_ID],'Play 2' [Event],45568242 [CUSTOMER],43673464 [SUBSCRIBER],'Y' [PAID] UNION 
SELECT GETDATE() -2 [DATE] ,3527194 [Event_ID],'Play 2' [Event],45568242 [CUSTOMER],45023437 [SUBSCRIBER],'N' [PAID] UNION 

SELECT GETDATE() -3 [DATE] ,4094832 [Event_ID],'Play 5' [Event],31485304 [CUSTOMER],43922788 [SUBSCRIBER],'Y' [PAID] UNION 
SELECT GETDATE() -3 [DATE] ,4094832 [Event_ID],'Play 5' [Event],31485304 [CUSTOMER],45022503 [SUBSCRIBER],'Y' [PAID] UNION 
SELECT GETDATE() -3 [DATE] ,4094832 [Event_ID],'Play 5' [Event],31485304 [CUSTOMER],45022503 [SUBSCRIBER],'N' [PAID] UNION 
SELECT GETDATE() -3 [DATE] ,4094832 [Event_ID],'Play 5' [Event],31485304 [CUSTOMER],33260562 [SUBSCRIBER],'Y' [PAID] UNION 
SELECT GETDATE() -3 [DATE] ,4094833 [Event_ID],'Play 6' [Event],31485304 [CUSTOMER],43922788 [SUBSCRIBER],'N' [PAID] UNION 
SELECT GETDATE() -3 [DATE] ,4094833 [Event_ID],'Play 6' [Event],31485304 [CUSTOMER],33260562 [SUBSCRIBER],'N' [PAID] UNION 
SELECT GETDATE() -3 [DATE] ,4094833 [Event_ID],'Play 6' [Event],31485304 [CUSTOMER],45022503 [SUBSCRIBER],'N' [PAID]) as tbl 

輸出

DATE Event_ID EVENT CUSTOMER SUBS Paid 
02/01/2012 3513709 Play 1 41285030 38803277 Y 
02/01/2012 3513709 Play 1 41285030 45051523 Y 
02/01/2012 3513709 Play 1 41285030 45051523 Y 
01/31/2012 3527194 Play 2 45568242 43673464 Y 
01/31/2012 3527194 Play 2 45568242 45023437 Y 
01/30/2012 4094832 Play 5 31485304 33260562 Y 
01/30/2012 4094832 Play 5 31485304 43922788 Y 
01/30/2012 4094832 Play 5 31485304 45022503 Y 
01/30/2012 4094832 Play 5 31485304 45022503 Y 
01/30/2012 4094833 Play 6 31485304 33260562 N 
01/30/2012 4094833 Play 6 31485304 43922788 N 
01/30/2012 4094833 Play 6 31485304 45022503 N