1

いくつかの値を計算して別のテーブルに追加しようとしています。

だから私は予約、治療、請求書を持っています。ユーザーがいくつかのトリートメントを予約すると、予約セッションで請求書が生成されます。予約セッションの数に応じて計算された値を入力しようとして、請求書の挿入明細書を手動で作成しました。ps。治療価格は治療表にあります。

SQL> SELECT * FROM INVOICE;

    INV_ID|INV_DATETIME                  |INV_SUBTOTAL|INV_DISCOUNT|  INV_TOTAL
----------|------------------------------|------------|------------|-----------
       100|14-NOV-12 09.40.06.918000     |        $.00|        $.00|       $.00
       101|18-MAR-12 10.03.00.000000     |        $.00|        $.00|       $.00
       102|18-MAR-12 10.15.00.000000     |        $.00|        $.00|       $.00
       103|18-MAR-12 10.55.00.000000     |        $.00|        $.00|       $.00
       104|18-MAR-12 10.38.00.000000     |        $.00|        $.00|       $.00
       105|12-JUN-12 15.15.00.000000     |        $.00|        $.00|       $.00
       106|06-AUG-12 12.13.00.000000     |        $.00|        $.00|       $.00
       107|04-MAY-12 09.15.00.000000     |        $.00|        $.00|       $.00
       108|29-NOV-12 13.16.00.000000     |        $.00|        $.00|       $.00
       109|18-MAR-12 10.37.00.000000     |        $.00|        $.00|       $.00
       110|21-MAR-12 11.26.00.000000     |        $.00|        $.00|       $.00
       111|24-APR-12 11.16.00.000000     |        $.00|        $.00|       $.00
       112|12-MAY-12 10.27.00.000000     |        $.00|        $.00|       $.00
       113|21-MAY-12 13.33.00.000000     |        $.00|        $.00|       $.00
       114|18-JAN-12 12.17.00.000000     |        $.00|        $.00|       $.00
       115|20-JUN-12 11.18.00.000000     |        $.00|        $.00|       $.00
       116|09-JUN-12 10.14.00.000000     |        $.00|        $.00|       $.00

したがって、次の sql クエリを使用して、請求書の小計価格を計算しています。一度に多くの予約セッションを予約できるため、これらは同じ請求書に表示されます *..1

SQL> COLUMN total FORMAT $99,999.99
SQL> SELECT IV.INV_ID, SUM(TR.TR_PRICE) as Total
  2  FROM BOOKING_SESSION BS, TREATMENT TR, INVOICE IV
  3  WHERE BS.INV_ID = IV.INV_ID
  4  AND BS.BK_TREATMENT = TR.TR_ID
  5  GROUP BY IV.INV_ID
  6  ORDER BY BS.INV_ID ASC;

    INV_ID|      TOTAL
----------|-----------
       100|    $605.00
       101|     $45.00
       102|     $70.00
       103|     $65.00
       104|     $50.00
       105|     $25.00
       106|     $25.00
       107|     $25.00
       108|     $25.00
       109|     $50.00
       110|     $25.00
       111|     $50.00
       112|     $15.00
       113|     $15.00
       114|     $25.00
       115|     $25.00
       116|     $25.00

今、私は各値を取得して、INV_SUBTOTAL

私は次のことを試みましたが、うまくいかないようです。

CREATE OR REPLACE TRIGGER INV_SUBTOTAL
BEFORE INSERT OR UPDATE ON BOOKING_SESSION
FOR EACH ROW
BEGIN
   SELECT 
        (SELECT SUM(TR.TR_PRICE) FROM BOOKING_SESSION BS, TREATMENT TR, INVOICE IV WHERE BS.INV_ID = IV.INV_ID AND BS.BK_TREATMENT = TR.TR_ID)
      INTO :NEW.INV_SUBTOTAL
   FROM DUAL;
END;
/

警告: トリガーはコンパイル エラーで作成されました。

SQL> SHOW ERROR
Errors for TRIGGER INV_SUBTOTAL:

LINE/COL|ERROR
--------|-----------------------------------------------------------------
4/12    |PLS-00049: bad bind variable 'NEW.INV_SUBTOTAL'
SQL>

私のやり方が悪いのかもしれません(T_T)

関連テーブルのデータは次のとおりです。

SQL> select * from treatment;

     TR_ID|TR_NAME             |TR_SPECIALIST|   TR_PRICE
----------|--------------------|-------------|-----------
         1|Hair removal        |            1|     $25.00
         2|Hair styling        |            1|     $50.00
         3|Nails               |            1|     $15.00
         4|Botox               |            1|     $30.00
         5|Make up             |            5|     $35.00
         6|Reflexology         |            3|     $25.00
         7|Massage therapy     |            3|     $25.00
         8|Facial care         |            4|     $25.00
         9|Weight loss         |            2|     $40.00
        10|Consultation        |            2|     $20.00

10 rows selected.

SQL> select * from booking_session
  2  where inv_id > 100;

     BK_ID|BK_DATE                       | BK_BOOKER|BK_CUSTOMER|BK_TREATMENT|START_SESSION              |END_SESSION              |STAFFAPPOINTED|   BK_ROOM|    INV_ID
----------|------------------------------|----------|-----------|------------|------------------------------|------------------------------|--------------|----------|----------
         4|18-MAR-12 10.35.00.000000     |         1|          4|          10|20-MAR-12 12.00.00.000000     |20-MAR-12 13.00.00.000000     |             1|         4|       109
         5|18-MAR-12 10.36.00.000000     |         1|          4|           4|21-MAR-12 11.00.00.000000     |20-MAR-12 12.00.00.000000     |             1|         5|       109
         6|18-MAR-12 10.50.00.000000     |         5|          5|           2|20-MAR-12 11.00.00.000000     |20-MAR-12 12.00.00.000000     |             5|         6|       103
        11|18-MAR-12 10.09.00.000000     |        10|         10|          10|20-MAR-12 11.00.00.000000     |20-MAR-12 12.00.00.000000     |            10|        10|       102
        12|18-MAR-12 10.12.00.000000     |        10|         10|           6|22-MAR-12 11.00.00.000000     |22-MAR-12 12.00.00.000000     |            11|        11|       102
        16|18-MAR-12 10.00.00.000000     |        15|         14|          10|20-MAR-12 11.00.00.000000     |20-MAR-12 12.00.00.000000     |            15|        14|       101
        17|18-MAR-12 10.02.00.000000     |        15|         14|           7|20-MAR-12 12.00.00.000000     |20-MAR-12 13.00.00.000000     |            16|        15|       101
        31|21-MAR-12 11.25.00.000000     |         1|          4|           1|24-MAR-12 11.00.00.000000     |24-MAR-12 12.00.00.000000     |             2|         1|       110
        32|24-APR-12 11.15.00.000000     |         1|          4|           2|26-APR-12 12.00.00.000000     |26-APR-12 13.00.00.000000     |             3|         2|       111
        33|12-MAY-12 10.25.00.000000     |         1|          4|           3|21-MAY-12 13.00.00.000000     |21-MAY-12 14.00.00.000000     |             4|         3|       112
        34|21-MAY-12 13.32.00.000000     |         1|          4|           3|26-MAY-12 15.00.00.000000     |26-MAY-12 16.00.00.000000     |             4|         3|       113
        35|18-JAN-12 12.14.00.000000     |         1|          4|           6|21-JAN-12 11.00.00.000000     |21-JAN-12 12.00.00.000000     |            17|         5|       114
        36|20-JUN-12 11.16.00.000000     |         1|          4|           7|25-JUN-12 11.00.00.000000     |25-JUN-12 12.00.00.000000     |            22|         5|       115
        37|09-JUN-12 10.12.00.000000     |         1|          4|           8|11-JUL-12 11.00.00.000000     |11-JUL-12 12.00.00.000000     |            24|         5|       116
        20|18-MAR-12 10.30.00.000000     |        15|         17|           7|20-MAR-12 09.00.00.000000     |20-MAR-12 10.00.00.000000     |            16|        17|       104
        39|18-MAR-12 10.35.00.000000     |         1|         17|           8|25-MAR-12 13.00.00.000000     |25-MAR-12 14.00.00.000000     |            24|         5|       104
        40|12-JUN-12 15.11.00.000000     |         1|         17|           8|11-JUL-12 11.00.00.000000     |11-JUL-12 12.00.00.000000     |            24|         5|       105
        41|06-AUG-12 12.13.00.000000     |         1|         17|           8|11-AUG-12 11.00.00.000000     |11-AUG-12 12.00.00.000000     |            24|         5|       106
        42|04-MAY-12 09.15.00.000000     |         1|         17|           8|28-JUN-12 11.00.00.000000     |28-JUN-12 12.00.00.000000     |            24|         5|       107
        43|29-NOV-12 13.16.00.000000     |         1|         17|           8|01-DEC-12 11.00.00.000000     |01-DEC-12 12.00.00.000000     |            24|         5|       108
        44|18-MAR-12 10.53.00.000000     |         5|          5|           3|20-MAR-12 13.00.00.000000     |20-MAR-12 14.00.00.000000     |             6|         7|       103
        38|18-MAR-12 10.13.00.000000     |         1|         10|           8|25-MAR-12 12.00.00.000000     |25-MAR-12 13.00.00.000000     |            24|         5|       102

これは、この質問に関連するERDのビットです。

erd2

4

1 に答える 1

1

目的が、2 番目のクエリで計算された特定のINV_SUBTOTAL列を更新することである場合は、ステートメントが必要になります。私の推測では (テーブルまたはテーブルがどのように見えるか、またはそれらに含まれるデータがわからないため)、次のような相関更新が必要であるということです。INVOICEINV_IDTOTALUPDATETREATMENTBOOKING_SESSION

UPDATE invoice inv
   SET inv_subtotal = (SELECT SUM(tr.tr_price)
                         FROM treatment tr,
                              booking_session bs
                        WHERE bs.inv_id = inv.inv_id
                          AND bs.bk_treatment = tr.tr_id)

実際にテーブルBOOKING_SESSIONを更新(または挿入)しない限り、トリガーは何もしません。BOOKING_SESSION一般に、行レベルのトリガーは、数日前にあなたの質問の 1 つで説明した変更テーブルの例外を生成せずにテーブルをBOOKING_SESSIONクエリすることもできません。また、トリガー内のレコードは、トリガーが定義されているテーブルに基づいています。テーブルの一部である列のみを参照できます。トリガーを定義したテーブルの列でない限り、参照できません。BOOKING_SESSION:newBOOKING_SESSION:new.inv_subtotalINV_SUBTOTAL

現実の世界では、ここにも深刻な非正規化の問題があります。集計データを行レベル データとは別に保存すると、基本的な正規化に違反し、集計データがTREATMENTテーブルに保存されている下位レベルのデータと一致しないというデータ品質の問題がほぼ確実に発生します。これは単なる宿題なので、教授はその問題を無視してほしいと思っているかもしれませんが、現実の世界では非常に敏感になりたいと思うものです。

于 2012-11-19T21:09:09.897 に答える