2

これはサンプルテーブルです

ID  STOREA  STOREB  STOREC   AB   BC   CA  ABC
--- ------- ------  -------  --   --  ---  ---
10    1       0       0
10    0       1       0
10    0       1       0
29    0       1       0 
29    0       0       1
29    1       0       0      

各行は、ストアA、B、またはCのいずれかで行われた購入に対応します。顧客10はAとBで買い物をしますが、cではありません。したがってAB=1 BC=0 CA=0 ABC=0 、すべてのID = 10行が必要であり、ID = 29の場合、彼は3つすべてを購入するのでAB=1 BC=1 CA=1 ABC=1、ID = 29のすべての行が必要です(ORACLE SQLを使用)。

テーブルの列を更新したいと思います。

4

2 に答える 2

4

これを行う1つの方法があります。JOINsOracleでステートメントを使用できるとは思いませんがUPDATE、次を使用して同じことを実行できますMERGE

MERGE
INTO    yourtable
USING   (
          select id as idnew, 
            case when a + b = 2 then 1 else 0 end abnew,
            case when b + c = 2 then 1 else 0 end bcnew,
            case when a + c = 2 then 1 else 0 end acnew,
            case when a + b + c = 3 then 1 else 0 end abcnew
          from (
            select 
              id,
              max(case storea when 1 then 1 else 0 end)  A,
              max(case storeb when 1 then 1 else 0 end)  B,
              max(case storec when 1 then 1 else 0 end)  C
            from yourtable
            group by id
          ) a
        )
ON      (id = idnew)
WHEN MATCHED THEN
UPDATE
SET     ab = abnew, 
  bc = bcnew,
  ac = acnew,
  abc = abcnew

SQLフィドルデモ

于 2013-03-22T02:35:30.627 に答える
2

これを次のように行う方法は次のselectとおりです。

update (select id, storea, storeb, storec, AB as new_AB, BC as new_BC, AC as new_AC, ABC as new_ABC
        from t join
             (select id,
                     (case when max(storeA) = 1 and max(storeB) = 1 then 1 else 0 end) as AB,
                     (case when max(storeB) = 1 and max(storeC) = 1 then 1 else 0 end) as BC,
                     (case when max(storeA) = 1 and max(storeC) = 1 then 1 else 0 end) as AC,
                     (case when max(storeA) = 1 and max(storeB) = 1 and max(storeC) = 1 then 1 else 0 end) as ABC
              from t
              group by id
             ) tsum
             on t.id = tsum.id
            )
     set AB = new_AB, AC = new_AC, BC = new_BC, ABC = new_ABC;

私はこれがうまくいくかもしれないと思います:

select id, storea, storeb, storec, AB, BC, AC, ABC
from t join
     (select id,
             (case when max(storeA) = 1 and max(storeB) = 1 then 1 else 0 end) as AB,
             (case when max(storeB) = 1 and max(storeC) = 1 then 1 else 0 end) as BC,
             (case when max(storeA) = 1 and max(storeC) = 1 then 1 else 0 end) as AC,
             (case when max(storeA) = 1 and max(storeB) = 1 and max(storeC) = 1 then 1 else 0 end) as ABC
      from t
      group by id
     ) tsum
     on t.id = tsum.id
            )
     set AB = new_AB, AC = new_AC, BC = new_BC, ABC = new_ABC;
于 2013-03-22T02:25:49.283 に答える