SQL - Дублирование данных между соответствующими записями - PullRequest
0 голосов
/ 13 февраля 2012

У меня под рукой довольно простая задача SQL, и я хотел бы получить подтверждение (или руководство) для решения, которое придумал. Спасибо за помощь! (это мой первый пост)

Вот проблема, с которой я сталкиваюсь (упрощенно):

Я импортирую информацию о пользователе из простого файла в промежуточную таблицу (используя SSIS). У каждого пользователя будет 2 или 3 записи. Каждая строка будет содержать важные данные. Конечный результат должен составлять 1 запись на каждого клиента, содержащую информацию от всех 3.

Вот пример данных:

PK |    Name   | UniqueCustID | Info1 | Info2  | Info3 |
----------------------
1   | John Doe  |    12345     |  Opt1  |  NULL |  NULL
2   | John Doe  |    12345     |  NULL  |  Opt2 |  NULL
3   | John Doe  |    12345     |  NULL  |  NULL |  Opt3

Окончательный результат должен быть примерно таким:

 PK |    Name   | UniqueCustID | Info1 | Info2  | Info3 |
----------------------
1   | John Doe  |    12345     |  Opt1  |  Opt2 |  Opt3

Я стараюсь сделать это как можно проще. Я хочу справиться с этим с помощью базовой задачи «Выполнение SQL» в службах SSIS (или пары). Каковы реакции людей на скачок? Могу ли я предоставить дополнительную информацию? Еще раз спасибо.

ОБНОВЛЕНИЕ - Чтобы показать двухэтапный процесс, который я пытаюсь:

1) Это должно привести в соответствие все отдельные наборы клиентов:

WITH CustInfoTMP (UniqueCustID,Info1,Info2,Info3)
AS
    (
    SELECT UniqueCustID,MAX(Info1),MAX(Info2),MAX(Info3)
    FROM CustStaging
    GROUP BY UniqueCustID 
    )
UPDATE CustStaging 
SET 
    CustStaging.Info1 = CustInfoTMP.Info1
    CustStaging.Info2 = CustInfoTMP.Info2
    CustStaging.Info3 = CustInfoTMP.Info3
FROM CustStaging
INNER JOIN CustStagingTMP ON CustStaging.UniqueCustID = CustStagingTMP.UniqueCustID

2) Затем я использую это для удаления дублирующихся записей:

DELETE
FROM CustStaging 
WHERE UniqueCustID NOT IN
    (
    SELECT MAX(PK) 
    FROM CustStaging 
    GROUP BY UniqueCustID
    )

Я надеюсь, что все следуют этому. Я действительно ценю обратную связь.

Ответы [ 3 ]

3 голосов
/ 13 февраля 2012

используйте функцию max, это исключит нули:

select min(id), UniqueCustID, name, max (Opt1), max(Opt2), max(Opt3)
from TABLE
group by UniqueCustID, name
0 голосов
/ 13 февраля 2012

Как насчет этого?

CREATE TABLE TargetTable_tbl
( ID INT IDENTITY(1,1) ,
  Name  varchar(100),
  Info1 varchar(10),
  Info2 varchar(10),
  Info3 varchar(10)
)
go

insert TargetTable_tbl 

select distinct Name, Info1, Info2, Info3
from StagingTable_tbl ST
left join 
( select distinct Name, Info1
  from StagingTable_tbl 
  where Info1 is not null ) I1 on ST.Name = I1.Name
left join 
( select distinct Name, Info2
  from StagingTable_tbl 
  where Info2 is not null ) I2 on ST.Name = I2.Name
left join 
( select distinct Name, Info3
  from StagingTable_tbl 
  where Info3 is not null ) I3 on ST.Name = I3.Name
go  
0 голосов
/ 13 февраля 2012

Возможно:

select a.name, a.uniqueCustID,
a.info1, b.info2, c.info3
from table1 a
left outer join table1 b on b.pk = a.pk and b.info1 is not null
left outer join table1 c on c.pk = a.pk and c.info2 is not null

Левые внешние объединения необходимы, потому что вы заранее не знаете, будет ли у пользователя 1, 2 или 3 записи с данными. Таким образом, если данных нет, в соответствующее поле будет вставлено значение NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...