1

これが私が持っているものの例です:


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

上の表は、データベースにクエリを実行したときの私の CTE の例です。この基本クエリでは、月のコントロール (日付コントロール) テーブルを使用して、FiscalPeriod が欠落している場所に追加しました。これを行うと、明らかにヌルを持つ行が作成されます。

私がしたいのは、列「Account」、「Company」、および「SegValue1」の NULL を、各 Account ごとに「0」に等しい FiscalPeriod を含む行の値に置き換えることです。
例として、アカウント「10-1156-000-」には会計期間「2」の行がありませんでした。monthControl テーブルを使用して行が追加されたとき、fiscalperiod 列以外のすべてに Null が含まれていました。列 "Account"、"Company"、および "SegValue1" には、会計期間が "0" で、かつアカウントが "10-1156-000-" に等しい行にある sam 値が含まれている必要があります。アカウント「10-1157-000-」では、会計期間「1」が欠落していました。

クエリがプルするアカウントはいくつでも存在する可能性があり、これらのアカウントのいくつでも、追加して入力する必要がある会計期間または複数の会計期間が欠落している可能性があります。

よろしくお願いします。

この特定の状況での望ましい出力の例を次に示します。

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
4

2 に答える 2

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;
于 2013-09-13T14:10:35.663 に答える
0

Companyとに対してそれを行う 1 つの方法を次に示します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新しい値に一致させる方法がないため、 に同じ方法を使用することはできません。

于 2013-09-13T13:50:25.497 に答える