комплексное обновление sql - PullRequest
1 голос
/ 10 октября 2011

Таблица MyTable содержит 4 столбца.

  • id, телефонные столбцы уникальны.
  • id, телефон, почтовый индекс никогда не бывают пустыми.

id - phone -        salary   - zipcode

1  - 61730459987 - $56052.45 - 02456

2 - 21249620709 - NULL -      10023

3 - 21200830859 - $39089.28 - 10023

...

10000 - 64600830857 - $46063.72 - 03795**

Мне нужно удалить NULL, заменив их salary_estimates на основе информации из тех же почтовых индексов.

Как и в примере выше, NULL в строке № 2 можно заменить на $ 39089,28 (из таблицы видно, что другой человек с таким же почтовым индексом 10023 зарабатывает $ 39089,28, поэтому можно обновить NULL для # 2 с $ 39089,28 ). Поэтому после выполнения этого запроса количество пустых ячеек может быть уменьшено (хотя и не до нуля).

Может кто-нибудь предложить запрос на обновление для этой проблемы?

Ответы [ 3 ]

1 голос
/ 10 октября 2011

Я не уверен, что это будет работать для MySQL.Но в MSSQL вы можете сделать это следующим образом:

UPDATE MyTable
SET salary = (select top 1 salary from MyTable where zipcode = t1.zipcode and salary is not null)
FROM MyTable t1 
WHERE t1.salary is null

Вам необходимо проверить эквивалентный случай объединения для mysql.

Ref.Тестовый запрос:

create table #temp (id int, salary decimal(18,2), zipcode varchar(10))
insert into #temp values (1,56052.45,02456)
insert into #temp values (2,NULL,1023)
insert into #temp values (3,39089.28,1023)
insert into #temp values (4,46063.72,03795)
insert into #temp values (5,NULL,02456)

UPDATE #temp
SET salary = (select top 1 salary from #temp where zipcode = t1.zipcode and salary is not null)
FROM #temp t1 
WHERE t1.salary is null

select * from #temp
drop table #temp 
1 голос
/ 10 октября 2011
UPDATE
      MyTable AS tu
  JOIN 
      ( SELECT zipcode
             , AVG(salary) AS SalaryEstimate          --- AVG, MAX, MIN
                                                      --- your choice
        FROM MyTable 
        WHERE salary IS NOT NULL
        GROUP BY zipcode
      ) AS te
    ON te.zipcode = tu.zipcode
SET 
      tu.salary = te.SalaryEstimate
WHERE 
      tu.salary IS NULL
0 голосов
/ 10 октября 2011

Вы можете сделать это следующим образом: если salary равно нулю, оно заменит зарплату этого почтового индекса.

isnull(salary,(Select top 1 salary  from  MyTable  where zipcode=10023 ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...