2013-09-13 3 views
1

Вот пример того, что у меня есть:SQL QUERY заменить NULL значение в строке с другим значением


CREATE TABLE test1(Account varchar(50), FiscalPeriod int, OpenBalance decimal(18,3),debitamt decimal(18,3), company varchar(10), SegValue1 int); 

INSERT INTO test1 VALUES('10-1155-000-', 0,1000000,0,'EII',1155); 
INSERT INTO test1 VALUES('10-1155-000-', 1,0,45000,'EII',1155); 
INSERT INTO test1 VALUES('10-1155-000-', 2,0,250,'EII',1155); 
INSERT INTO test1 VALUES('10-1155-000-', 3,0,60000,'EII',1155); 
INSERT INTO test1 VALUES('10-1156-000-', 0,55000,0,'EII',1156); 
INSERT INTO test1 VALUES('10-1156-000-', 1,0,850,'EII',1156); 
INSERT INTO test1 VALUES(NULL, 2,NULL,NULL,NULL,NULL); 
INSERT INTO test1 VALUES('10-1156-000-', 3,0,4000,'EII',1156); 
INSERT INTO test1 VALUES('10-1157-000-', 0,150000,0,'EII',1157); 
INSERT INTO test1 VALUES(NULL, 1,NULL,NULL,NULL,NULL); 
INSERT INTO test1 VALUES('10-1157-000-', 2,0,6000,'EII',1157); 
INSERT INTO test1 VALUES('10-1157-000-', 3,0,100,'EII',1157); 

SELECT * FROM test1 

Приведенная выше таблица является примером того, что мой КТР выглядит, когда запрос базы данных. В этом базовом запросе я добавил в местах, где отсутствует FiscalPeriod, используя таблицу управления месяцем (контроль даты). Выполнение этого, очевидно, создает строки, которые имеют нулевое значение.

Что я хотел бы сделать, это заменить NULL в столбцах «Учетная запись», «Компания» и «SegValue1» со значениями из строки, содержащей FiscalPeriod, равную «0» для каждой учетной записи.
В качестве примера на счету «10-1156-000-» отсутствовала строка с фискальным периодом «2». Когда строка была добавлена ​​с помощью таблицы monthControl, все, кроме столбца financialperiod, содержали Nulls. В столбцах «Учетная запись», «Компания» и «SegValue1» должно содержаться значение sam, которое находится в строке с фискальным периодом «0» И где учетная запись равна «10-1156-000-». На счету «10-1157-000-» отсутствовал финансовый период «1». Нули в этой строке должны быть заполнены данными из строки с фискальным периодом «0», а учетная запись равна «10-1157-000-».

Там может быть любое количество учетных записей, которые запрос вытягивает и любое количество этих счетов может быть отсутствует fiscalperiod или несколько fiscalperiods, которые должны быть добавлены и заполнены.

Заранее спасибо за вашу помощь!

Вот пример моего желаемого выхода для этой конкретной ситуации:

CREATE TABLE test1(Account varchar(50), FiscalPeriod int, OpenBalance decimal(18,3),debitamt decimal(18,3), company varchar(10), SegValue1 int); 

INSERT INTO test1 VALUES('10-1155-000-', 0,1000000,0,'EII',1155); 
INSERT INTO test1 VALUES('10-1155-000-', 1,0,45000,'EII',1155); 
INSERT INTO test1 VALUES('10-1155-000-', 2,0,250,'EII',1155); 
INSERT INTO test1 VALUES('10-1155-000-', 3,0,60000,'EII',1155); 
INSERT INTO test1 VALUES('10-1156-000-', 0,55000,0,'EII',1156); 
INSERT INTO test1 VALUES('10-1156-000-', 1,0,850,'EII',1156); 
INSERT INTO test1 VALUES('10-1156-000-', 2,0,0,'EII',1156); 
INSERT INTO test1 VALUES('10-1156-000-', 3,0,4000,'EII',1156); 
INSERT INTO test1 VALUES('10-1157-000-', 0,150000,0,'EII',1157); 
INSERT INTO test1 VALUES('10-1157-000-', 1,0,0,'EII',1157); 
INSERT INTO test1 VALUES('10-1157-000-', 2,0,6000,'EII',1157); 
INSERT INTO test1 VALUES('10-1157-000-', 3,0,100,'EII',1157); 

SELECT * FROM test1 
+0

Вы можете добавить свой желаемый результат? – Teja

+0

Я добавил желаемый результат. – Kevin

+0

Это было бы намного проще с меньшим количеством данных для просмотра. Почему бы не показать только строки с нулевыми данными и строками, из которых вы хотите получить данные. –

ответ

0

Я думаю, вы бы лучше с удалением NULL строк, а затем вставить «выброшенных» из них, как это:

delete test1 where Account is null; 

with FiscalPeriods(n) as (
    select 1 union all select 2 union all select 3 
), newrows as (
    select Account,n,OpenBalance,debitamt,company,SegValue1 
    from test1 t 
    cross join FiscalPeriods f 
    where t.FiscalPeriod=0 and not exists(select * from test1 x where x.Account=t.Account and x.FiscalPeriod=n) 
) 
insert test1 
select * from newrows; 
+0

Это делает именно то, что я хочу. Спасибо за то, что вы думаете за пределами коробки, так как я вижу, что я не обращал внимания на то, что хотел, насколько мог. :) Я знал, что есть способ сделать это. – Kevin

0

Вот один из способов сделать это для Company и SegValue1:

update t 
    set Company = coalesce(t.Company, newvals.Company), 
     SegValue1 = coalesce(t.SegValue1, newvals.SegValue1) 
    from test1 t join 
     (select * 
      from test1 
      where FiscalPeriod = 0 
     ) newvals 
     on t.account = newvals.account 
    where t.Company is NULL or t.SegValue1 is NULL; 

Вы не можете использовать тот же метод для Account, потому что нет способа соответствовать новым значениям.

+0

Спасибо, но мне нужен способ сделать это для всех трех столбцов. Кроме того, я привел пример вывода для запроса, который у меня есть. Я не могу обновить таблицы информацией. – Kevin

+0

@Kevin. , , Ваше правило гласит: «Я бы хотел сделать замену NULL в столбцах« Учетная запись »,« Компания »и« SegValue1 »со значениями из строки, содержащей FiscalPeriod, равную« 0 »для каждой учетной записи». Вы не можете сделать это для 'Account'. –

+0

Когда я запустил вышеупомянутое решение, он даже не обновил столбцы компании и segvalue1. В нем указывается «0 строк (строк)» – Kevin

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