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 句を使用します。