2014-12-01 90 views
1

我在比較2個表。一個有新的數據,另一個有上個月的舊數據。數據是每月發佈的,每次都是所有數據。沒有PK,任何領域都可以改變。我需要顯示哪些字段及其舊值改變了記錄。它可能是1個或更多的字段。爲此,我創建了內部連接,其中所有字段都連接在1以外,然後在我說的舊值不等於新值的位置,然後添加2列,告訴我我們正在查看的字段以及舊的價值是。我做這個查詢每個字段和工會的結果,所以我的決賽桌的樣子:由一些字段組和其他字段組成

FieldA, FieldB, FieldC, FieldChanged, OldValue 

FieldChanged將具有改變該記錄的OldValue和會說什麼老值的字段名。

如果一條記錄有超過1個字段發生了變化(那裏有),那麼我得到Field A-C在結果中被複制,具有不同的FieldChanged和OldValue值。但是,我想通過FieldA,FieldB,FieldC來做一個組,並以某種方式聯繫所有相同記錄中的FieldChanged和所有相同記錄中的OldValue。

聯合查詢結果會是什麼樣子(第3場是新數據的樣子):

"Tiger", "74", "Masters", "FieldC", "The Masters" 
"Tiger", "74", "Masters", "FieldB", "68" 

我想組由場1-3和CONCAT在過去的2場組:

"Tiger", "74", "Masters", "FieldB,FieldC", "68,The Masters" 

現在,這僅僅是一個例子所以它的簡單,可能是說來容易,這是一個新的記錄,但是我的表有12個字段,所以,如果所有的比賽,但1場,它就有可能是相同的記錄,他們只是更新了其中一個字段。

這裏的關鍵是能夠按某些列進行分組,並將來自分組列的其他字段值連接在一起,以便不重複相同的記錄,並且我有1行顯示每條記錄已更改的字段,並且這是舊的價值觀。

回答

2

試試這個。

CREATE TABLE #test 
    (
    FieldA  VARCHAR(25), 
    FieldB  VARCHAR(25), 
    FieldC  VARCHAR(25), 
    FieldChanged VARCHAR(25), 
    OldValue  VARCHAR(25) 
) 

INSERT #test 
VALUES ('Tiger','74','Masters','FieldC','The Masters'), 
     ('Tiger','74','Masters','FieldB','68') 

方法1:對於XML PATH

SELECT my_column AS [text()] 
FROM my_table 
FOR XML PATH('') 

這給你所有這些列的值的連接值表中的

SELECT FieldA, 
     FieldB, 
     FieldC, 
     Stuff((SELECT ', ' + FieldChanged 
       FROM #test b 
       WHERE b.FieldA = a.FieldA 
        AND b.FieldB = a.FieldB 
        AND b.FieldC = a.FieldC 
       FOR XML PATH('')), 1, 2, '') FieldChanged, 
     Stuff((SELECT ', ' + OldValue 
       FROM #test b 
       WHERE b.FieldA = a.FieldA 
        AND b.FieldB = a.FieldB 
        AND b.FieldC = a.FieldC 
       FOR XML PATH('')), 1, 2, '') OldValue 
FROM #test a 
GROUP BY FieldA, 
      FieldB, 
      FieldC 

方法2:使用Cross Apply

SELECT FieldA, 
     FieldB, 
     FieldC, 
     Substring(d.FieldChanged, 1, Len(d.FieldChanged) - 1) FieldChanged, 
     Substring(d.OldValue, 1, Len(d.OldValue) - 1)   OldValue 
FROM (SELECT DISTINCT FieldA, 
         FieldB, 
         FieldC 
     FROM #test) a 
     CROSS APPLY (SELECT (SELECT FieldChanged + ', ' 
          FROM #test AS B 
          WHERE b.FieldA = a.FieldA 
            AND b.FieldB = a.FieldB 
            AND b.FieldC = a.FieldC 
          FOR XML PATH('')), 
          (SELECT OldValue + ', ' 
          FROM #test AS B 
          WHERE b.FieldA = a.FieldA 
            AND b.FieldB = a.FieldB 
            AND b.FieldC = a.FieldC 
          FOR XML PATH(''))) D (FieldChanged, OldValue) 
+0

只是好奇,爲什麼在東西選擇聲明你只比較哪裏fielda = fielda?我假設你必須爲所有領域做到這一點,而不僅僅是A?爲B和C做呢? – user441521 2014-12-01 17:59:39

+0

@ user441521 - 由於所有的值都是相同的,我沒有添加那些 – 2014-12-01 18:01:19

+0

你是什麼意思,因爲所有的值都是一樣的?如果你的意思是我的小例子(FieldA總是「老虎」),那麼對不起,假設有很多不同的值。所以我假設我需要比較所有。 – user441521 2014-12-01 18:03:38

相關問題