1

すでに多くの行がある DailyTotals テーブルに 4 つの新しい列を追加しました。毎日のすべてのポーン トランザクションをクエリして、新しい列に各行の毎日の合計を入力する必要があります。

DailyTotals テーブルは次のようになります。

    tblDailyTotals
    (
    dt_date DATE,       {unique index}
    ...
    dt_P_count INT,
    dt_P_amt DECIMAL(8,2),
    dt_X_count INT,
    dt_X_amt DECIMAL(8,2)
    );

ポーン トランザクション テーブルは次のようになります。

    tblPawnTransactions
    (
    ...
    pt_date DATE,       {dups index}
    pt_type CHAR(1), {"P","X"}
    pt_amt DECIMAL(7,2)
    );

DailyTotals テーブルの日次行ごとに 4 つの新しい列を設定する一括更新クエリをどのようにコーディングしますか?

4

1 に答える 1

2

Informix SQL の動作例を次に示します。環境に DBDATE='Y4MD-' または同等の設定があることを前提としています — 好みに合わせて日付形式を調整する必要があります。

設定

CREATE TABLE    tblDailyTotals
    (
    dt_date DATE PRIMARY KEY NOT NULL,       {unique index}
    dt_other CHAR(20) NOT NULL,
    dt_P_count INT,
    dt_P_amt DECIMAL(8,2),
    dt_X_count INT,
    dt_X_amt DECIMAL(8,2)
    );


CREATE TABLE   tblPawnTransactions
    (
    pt_customer INT,
    pt_date DATE,       {dups index}
    pt_type CHAR(1), {"P","X"}
    pt_amt DECIMAL(7,2)
    );

INSERT INTO tblDailyTotals(dt_date, dt_other) VALUES('2017-01-01', 'Other info 2017-01-01');
INSERT INTO tblDailyTotals(dt_date, dt_other) VALUES('2017-01-02', 'Other info 2017-01-02');
INSERT INTO tblDailyTotals(dt_date, dt_other) VALUES('2017-01-03', 'Other info 2017-01-03');
INSERT INTO tblDailyTotals(dt_date, dt_other) VALUES('2017-01-04', 'Other info 2017-01-04');
INSERT INTO tblDailyTotals(dt_date, dt_other) VALUES('2017-01-05', 'Other info 2017-01-05');
INSERT INTO tblDailyTotals(dt_date, dt_other) VALUES('2017-01-06', 'Other info 2017-01-06');
UPDATE tblDailyTotals
   SET dt_P_count = 3, dt_P_amt = 345.67, dt_X_count = 9, dt_X_amt = 291.23
 WHERE dt_date = '2017-01-06';

INSERT INTO tblPawnTransactions VALUES(1, '2017-01-01', 'P', 12.34);
INSERT INTO tblPawnTransactions VALUES(2, '2017-01-01', 'P', 22.25);
INSERT INTO tblPawnTransactions VALUES(3, '2017-01-01', 'X', 32.16);
INSERT INTO tblPawnTransactions VALUES(1, '2017-01-02', 'P', 42.07);
INSERT INTO tblPawnTransactions VALUES(4, '2017-01-02', 'P', 52.98);
INSERT INTO tblPawnTransactions VALUES(2, '2017-01-02', 'X', 62.89);
INSERT INTO tblPawnTransactions VALUES(1, '2017-01-03', 'P', 72.70);
INSERT INTO tblPawnTransactions VALUES(1, '2017-01-03', 'X', 82.51);
INSERT INTO tblPawnTransactions VALUES(1, '2017-01-03', 'P', 92.42);
INSERT INTO tblPawnTransactions VALUES(2, '2017-01-05', 'X', 13.33);
INSERT INTO tblPawnTransactions VALUES(1, '2017-01-05', 'P', 14.14);
INSERT INTO tblPawnTransactions VALUES(1, '2017-01-05', 'X', 15.05);

アップデート

SELECT * FROM tblDailyTotals ORDER BY dt_date;

UPDATE tblDailyTotals
   SET (dt_P_count, dt_P_amt) = ((SELECT COUNT(*), SUM(pt_amt)
                                    FROM tblPawnTransactions AS pt
                                   WHERE pt.pt_date = tblDailyTotals.dt_date
                                     AND pt.pt_type = 'P'
                                ))
 WHERE EXISTS(SELECT * FROM tblPawnTransactions AS pt
               WHERE pt.pt_date = tblDailyTotals.dt_date AND pt_type = 'P')
;

UPDATE tblDailyTotals
   SET (dt_X_count, dt_X_amt) = ((SELECT COUNT(*), SUM(pt_amt)
                                    FROM tblPawnTransactions AS pt
                                   WHERE pt.pt_date = tblDailyTotals.dt_date
                                     AND pt.pt_type = 'X'
                                ))
 WHERE EXISTS(SELECT * FROM tblPawnTransactions AS pt
               WHERE pt.pt_date = tblDailyTotals.dt_date AND pt_type = 'X')
;

二重括弧が必要です。外側のペアは、SET 句の左辺の括弧内の列のリストと一致するように、SET 節の右辺に値のリストがあることを示し、内側の括弧は値が SELECT ステートメントの結果であることを示します。 .

サンプルデータの出力

更新前:

2017-01-01  Other info 2017-01-0
2017-01-02  Other info 2017-01-0
2017-01-03  Other info 2017-01-0
2017-01-04  Other info 2017-01-0
2017-01-05  Other info 2017-01-0
2017-01-06  Other info 2017-01-0    3   345.67      9  291.23

更新後:

2017-01-01  Other info 2017-01-0    2   34.59       1   32.16
2017-01-02  Other info 2017-01-0    2   95.05       1   62.89
2017-01-03  Other info 2017-01-0    2   165.12      1   82.51
2017-01-04  Other info 2017-01-0
2017-01-05  Other info 2017-01-0    1   14.14       2   28.38
2017-01-06  Other info 2017-01-0    3   345.67      9  291.23

EXISTS 句を使用する理由

WHERE EXISTS(…)句を省略するとどうなりますか? 次のように、テーブルに一致するエントリがない行もtblPawnTransactions更新されます。

SELECT * FROM tblDailyTotals ORDER BY dt_date;

UPDATE tblDailyTotals
   SET (dt_P_count, dt_P_amt) = ((SELECT COUNT(*), SUM(pt_amt)
                                    FROM tblPawnTransactions AS pt
                                   WHERE pt.pt_date = tblDailyTotals.dt_date
                                     AND pt.pt_type = 'P'
                                ))
 ;

UPDATE tblDailyTotals
   SET (dt_X_count, dt_X_amt) = ((SELECT COUNT(*), SUM(pt_amt)
                                    FROM tblPawnTransactions AS pt
                                   WHERE pt.pt_date = tblDailyTotals.dt_date
                                     AND pt.pt_type = 'X'
                                ))
 ;

SELECT * FROM tblDailyTotals ORDER BY dt_date;

これにより、次が生成されます。

2017-01-01  Other info 2017-01-0    2   34.59       1   32.16
2017-01-02  Other info 2017-01-0    2   95.05       1   62.89
2017-01-03  Other info 2017-01-0    2   165.12      1   82.51
2017-01-04  Other info 2017-01-0    0               0
2017-01-05  Other info 2017-01-0    1   14.14       2   28.38
2017-01-06  Other info 2017-01-0    0               0

2017-01-04 と 2017-01-06 の行が両方とも更新されたことに注意してください。これらのゼロとヌルを配置したい場合は、それで問題ありません。そうでない場合は、EXISTS 句を使用します。

于 2017-05-05T17:41:18.960 に答える