6

私はテーブルを持っています::

CREATE TABLE emp1
(
  eid integer NOT NULL,
  ename character varying(20),
  sid integer,
  ssid integer,
  CONSTRAINT pk_eid PRIMARY KEY (eid)
);

CREATE TABLE leave_type
(
  eid integer,
  lid integer,
  lnum integer,
  emp_bal integer,
  sno serial NOT NULL,
  CONSTRAINT pk_sno PRIMARY KEY (sno),
  CONSTRAINT fk_eid FOREIGN KEY (eid)
      REFERENCES emp1 (eid) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
);//emp_bal-->employee balance leaves which is considered as 8

CREATE TABLE result
(
  eid integer,
  lid integer,
  sd date,
  ed date,
  sida boolean,
  ssida boolean,
  rsno serial NOT NULL,
  CONSTRAINT pk_rsno PRIMARY KEY (rsno)
);

挿入されたデータは

emp1
-----
 eid | ename | sid | ssid
-----+-------+-----+------
   1 | a     |   2 |    8
   3 | c     |   4 |    9
   2 | b     |   3 |    8
   4 | d     |   2 |    8
   5 | e     |   2 |    8
   6 | f     |   4 |    9

(6行)

leave_type
----------
 eid | lid | lnum | emp_bal | sno
-----+-----+------+---------+-----
   1 |   0 |    1 |       8 |   1
   3 |   0 |    1 |       8 |   2
   5 |   0 |    1 |       8 |   3
   1 |   1 |    1 |       8 |   4
   1 |   2 |    2 |       8 |   5
(5 rows)

result
-------
 eid | lid |     sd     |     ed     | sida | ssida | rsno
-----+-----+------------+------------+------+-------+------
   1 |   0 | 2013-01-01 | 2013-01-01 | t    | f     |    1
   3 |   0 | 2013-01-09 | 2013-01-09 | t    | f     |    2
   5 |   0 | 2013-01-11 | 2013-01-11 | t    | f     |    3
   1 |   1 | 2013-02-14 | 2013-02-14 | t    | f     |    4
   1 |   2 | 2013-03-15 | 2013-03-16 | f    | t     |    5
(5 rows)

クエリ:

決裁表を更新してほしい

CREATE TABLE approval
    (
      eid integer,
      lid integer,
      asid integer,
      bal integer
    );

出力として

      eid | lid | sid |bal
     -----+-----+---+--
       1 |   0 | 2 | 7
       3 |   0 | 4 | 7
       5 |   0 | 2 | 7
       1 |   1 | 2 | 6
       1 |   2 | 8 | 4
    (5 rows)

条件:: 以下に示すように、承認テーブルにsidを取得するためにこのクエリを試しました::

CASE WHEN r.sida='t' 
  THEN (update approval set a.asid=e.sid where a.eid=e.eid from emp1 e,approval a)
WHEN r.ssida='t'
  THEN (update approval set a.asid=e.ssid where a.eid=e.eid from emp1 e,approval a) 
ELSE 0
END

sid検証に基づいて残高列も更新する必要があります.

CASE if r.ssida='t' then bal=emp1.emp_bal-1 a​​nd emp1 in emp_bal is used to update the latest bal value from approval そうでなければ、r.ssida='t' then bal=emp_bal-2 and emp1 in emp_bal承認された bal の最新の値に更新する必要があります

これを解決する方法はありますか?

最後に、承認されたすべての従業員の休暇と、それを承認した人、残りの残りの休暇を見たいと思います!!

詳細は [SQL FIDDLE] ( http://sqlfiddle.com/#!12/3e6a7/18 )にあります。

4

1 に答える 1

5

あなたは間違っています。

Case ステートメント内で Update ステートメントを使用する代わりに、Update ステートメント内で Case ステートメントを使用します。

お気に入り

Update **Table**
Set **Col1**= 

Case when **Col10=1** then 5

else case when **Col10=2** THEN 6

**ELSE 10** END  
**ELSE 15** END
于 2013-07-15T10:50:26.240 に答える