2014-12-01 3 views
1

Я сравниваю 2 таблицы. У одного есть новые данные, а у других - данные прошлых месяцев. Данные поступают ежемесячно, и каждый раз все данные. Нет ПК, и любое поле может измениться. Мне нужно показать, какие поля и их старые значения изменили записи. Это может быть 1 или более полей. Для этого я создал внутренние объединения, где все поля объединяются, кроме 1, а затем в том месте, где я говорю, что старое значение не равно новому значению, и затем я добавляю 2 столбца, которые говорят мне, в каком поле мы смотрим, и что старое значение был. Я делаю этот запрос для каждого поля и объединения результатов так мой финальный стол выглядит следующим образом:Группа по отдельным полям и другим другим

FieldA, FieldB, FieldC, FieldChanged, OldValue 

FieldChanged будет иметь имена полей, которые изменили для этой записи и OldValue будет сказать, что было старое значение.

Если в записи было изменено более 1 поля (что есть), то я получаю это поле 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

Любопытно, почему в материале select statement вы сравниваете только где fielda = fielda? Я предполагаю, что вы должны сделать это для всех полей не только A? Делайте это также для B и C? – user441521

+0

@ user441521 - Поскольку все значения были такими же, я не добавлял их –

+0

Что вы имеете в виду, поскольку все значения были одинаковыми? Если вы имеете в виду в моем маленьком примере (где FieldA всегда «Тигр»), то извините, что существует множество разных значений. Поэтому я предполагаю, что мне нужно будет сравнить все. – user441521

Смежные вопросы